Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef OPENMS_MATH_MISC_MATHFUNCTIONS_H
00036 #define OPENMS_MATH_MISC_MATHFUNCTIONS_H
00037
00038 #include <OpenMS/CONCEPT/Types.h>
00039
00040 namespace OpenMS
00041 {
00049 namespace Math
00050 {
00062 inline static double ceilDecimal(double x, int decPow)
00063 {
00064 return (ceil(x / pow(10.0, decPow))) * pow(10.0, decPow);
00065 }
00066
00077 inline static double roundDecimal(double x, int decPow)
00078 {
00079 if (x > 0)
00080 return (floor(0.5 + x / pow(10.0, decPow))) * pow(10.0, decPow);
00081
00082 return -((floor(0.5 + fabs(x) / pow(10.0, decPow))) * pow(10.0, decPow));
00083 }
00084
00090 inline static double intervalTransformation(double x, double left1, double right1, double left2, double right2)
00091 {
00092 return left2 + (x - left1) * (right2 - left2) / (right1 - left1);
00093 }
00094
00102 inline double linear2log(double x)
00103 {
00104 return log10(x + 1);
00105 }
00106
00114 inline double log2linear(double x)
00115 {
00116 return pow(10, x) - 1;
00117 }
00118
00124 inline bool isOdd(UInt x)
00125 {
00126 return (x & 1) != 0;
00127 }
00128
00134 template <typename T>
00135 T round(T x)
00136 {
00137 if (x >= T(0))
00138 {
00139 return T(floor(x + T(0.5)));
00140 }
00141 else
00142 {
00143 return T(ceil(x - T(0.5)));
00144 }
00145 }
00146
00152 inline static bool approximatelyEqual(DoubleReal a, DoubleReal b, DoubleReal tol)
00153 {
00154 return std::fabs(a - b) <= tol;
00155 }
00156
00165 template <typename T>
00166 T gcd(T a, T b)
00167 {
00168 T c;
00169 while (b != 0)
00170 {
00171 c = a % b;
00172 a = b;
00173 b = c;
00174 }
00175 return a;
00176 }
00177
00190 template <typename T>
00191 T gcd(T a, T b, T & u1, T & u2)
00192 {
00193 u1 = 1;
00194 u2 = 0;
00195 T u3 = a;
00196
00197 T v1 = 0;
00198 T v2 = 1;
00199 T v3 = b;
00200
00201 while (v3 != 0)
00202 {
00203 T q = u3 / v3;
00204 T t1 = u1 - v1 * q;
00205 T t2 = u2 - v2 * q;
00206 T t3 = u3 - v3 * q;
00207
00208 u1 = v1;
00209 u2 = v2;
00210 u3 = v3;
00211
00212 v1 = t1;
00213 v2 = t2;
00214 v3 = t3;
00215 }
00216
00217 return u3;
00218 }
00219
00220 }
00221 }
00222
00223 #endif // OPENMS_MATH_MISC_MATHFUNCTIONS_H