Ajout de l'ensemble du workspace.
[GPU.git] / WCudaMSE / BilatTools_CPP / src / core / tools / cpp / MathTools.cpp
diff --git a/WCudaMSE/BilatTools_CPP/src/core/tools/cpp/MathTools.cpp b/WCudaMSE/BilatTools_CPP/src/core/tools/cpp/MathTools.cpp
new file mode 100755 (executable)
index 0000000..b8b1822
--- /dev/null
@@ -0,0 +1,242 @@
+#include <iostream>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <math.h>\r
+\r
+#include "MathTools.h"\r
+\r
+\r
+using std::cout;\r
+using std::endl;\r
+\r
+#ifndef MIN\r
+#define MIN(a,b) (((a)<(b))?(a):(b))\r
+#endif\r
+\r
+#ifndef MAX\r
+#define MAX(a,b) (((a)>(b))?(a):(b))\r
+#endif\r
+\r
+#ifndef ABS\r
+#define ABS(x) ((x)>0?(x):-(x))\r
+#endif\r
+\r
+#ifndef MAXABS\r
+#define MAXABS(a,b) (ABS((a))>ABS((b)) ? ABS((a)): ABS((b)))\r
+#endif\r
+\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |*                    Implementation                                  *|\r
+ \*---------------------------------------------------------------------*/\r
+\r
+/*--------------------------------------*\\r
+ |*            Constructor             *|\r
+ \*-------------------------------------*/\r
+\r
+MathTools::MathTools()\r
+    {\r
+   // rien\r
+    }\r
+\r
+MathTools::~MathTools()\r
+    {\r
+    // rien\r
+    }\r
+\r
+/*--------------------------------------*\\r
+ |*            Methodes static         *|\r
+ \*-------------------------------------*/\r
+\r
+/*----------------------*\\r
+ |*    static          *|\r
+ \*---------------------*/\r
+\r
+/*---------------*\\r
+|*     Float   *|\r
+\*---------------*/\r
+\r
+bool MathTools::isEquals(float x1, float x2, float epsilon)\r
+    {\r
+    bool isOk;\r
+    double delta;\r
+\r
+    if (x1 == 0 || x2 == 0)\r
+       {\r
+       delta = fabs(x1 - x2);\r
+       isOk = delta <= epsilon;\r
+       }\r
+    else\r
+       {\r
+       delta = fabs((x1 - x2) / MAXABS(x1,x2));\r
+       isOk = delta <= epsilon;\r
+       }\r
+\r
+    if (!isOk)\r
+       {\r
+       cout << "isEgale Float: (x1,x2)=(" << x1 << "," << x2 << ") : delta (Relatif) = " << delta << endl;\r
+       }\r
+\r
+    return isOk;\r
+    }\r
+\r
+\r
+bool MathTools::isEquals(float a, float b, float reference, float epsilon)\r
+    {\r
+    return fabs((a - b) / reference) <= epsilon;\r
+    }\r
+\r
+bool MathTools::isEquals(float* tabA, float* tabB, int n, float epsilon)\r
+    {\r
+    for (int i = 0; i < n; i++)\r
+       {\r
+       if (!isEquals(tabA[i], tabB[i], epsilon))\r
+           {\r
+           return false;\r
+           }\r
+       }\r
+    return true;\r
+    }\r
+\r
+bool MathTools::isEqualsRelatifMax(float* tabA, float* tabB, int n, float epsilon)\r
+    {\r
+    float max = maxAbs(tabA, tabB, n);\r
+\r
+    if (max != 0)\r
+       {\r
+       for (int i = 0; i < n; i++)\r
+           {\r
+           if (!isEquals(tabA[i], tabB[i], max, epsilon))\r
+               {\r
+               return false;\r
+               }\r
+           }\r
+       return true;\r
+       }\r
+    else\r
+       {\r
+       return true;// tous à zero\r
+       //return isEquals(tabA, tabB, n, epsilon);\r
+       }\r
+    }\r
+\r
+/*---------------*\\r
+|*     Double  *|\r
+\*---------------*/\r
+\r
+bool MathTools::isEquals(double x1, double x2, double epsilon)\r
+    {\r
+    bool isOk;\r
+    double delta;\r
+    if (x1 == 0 || x2 == 0)\r
+       {\r
+       delta = fabs(x1 - x2);\r
+       isOk = delta <= epsilon;\r
+       }\r
+    else\r
+       {\r
+       delta = fabs((x1 - x2) / MAXABS(x1,x2));\r
+       isOk = delta <= epsilon;\r
+       }\r
+\r
+    if (!isOk)\r
+       {\r
+       cout << "isEgale Double : (x1,x2)=(" << x1 << "," << x2 << ") : delta (Relatif) = " << delta << endl;\r
+       }\r
+\r
+    return isOk;\r
+    }\r
+\r
+/*---------------*\\r
+|*     Long    *|\r
+ \*---------------*/\r
+\r
+bool MathTools::isEquals(long x1, long x2)\r
+    {\r
+    long delta = labs(x1 - x2);\r
+    bool isOk = (delta == 0);\r
+\r
+    if (!isOk)\r
+       {\r
+       cout << "isEgale Long: (x1,x2)=(" << x1 << "," << x2 << ") : delta (Relatif) = " << delta << endl;\r
+       }\r
+\r
+    return isOk;\r
+    }\r
+\r
+bool MathTools::isPower2(long i)\r
+    {\r
+    while (i >= 2)\r
+       {\r
+       if (i % 2 != 0)\r
+           {\r
+           return false;\r
+           }\r
+       i /= 2;\r
+       }\r
+    return true;\r
+    }\r
+\r
+/*---------------*\\r
+|*     isPower2  *|\r
+\*---------------*/\r
+\r
+bool MathTools::isPower2(int i) // TODO operateur bit\r
+    {\r
+    while (i >= 2)\r
+       {\r
+       if (i % 2 != 0)\r
+           {\r
+           return false;\r
+           }\r
+       i /= 2;\r
+       }\r
+    return true;\r
+    }\r
+\r
+bool MathTools::isPower2(unsigned int i)  // TODO operateur bit\r
+    {\r
+    while (i >= 2)\r
+       {\r
+       if (i % 2 != 0)\r
+           {\r
+           return false;\r
+           }\r
+       i /= 2;\r
+       }\r
+    return true;\r
+    }\r
+\r
+/*--------------------------------------*\\r
+ |*    Methode static  private         *|\r
+ \*-------------------------------------*/\r
+\r
+float MathTools::maxAbs(float a, float b)\r
+    {\r
+    return MAXABS(fabs(a), fabs(b));\r
+    }\r
+\r
+float MathTools::maxAbs(float* tabA, float* tabB, int n)\r
+    {\r
+    float maxAbs = 0;\r
+\r
+    for (int i = 0; i < n; i++)\r
+       {\r
+       if (fabs(tabA[i]) > maxAbs)\r
+           {\r
+           maxAbs = fabs(tabA[i]);\r
+           }\r
+       if (fabs(tabB[i]) > maxAbs)\r
+           {\r
+           maxAbs = fabs(tabB[i]);\r
+           }\r
+       }\r
+\r
+    return maxAbs;\r
+    }\r
+\r
+\r
+/*----------------------------------------------------------------------*\\r
+ |*                    End                                             *|\r
+ \*---------------------------------------------------------------------*/\r
+\r