00001
00010 #ifndef __C_BASIC_MATH_H__
00011 #define __C_BASIC_MATH_H__
00012
00013 #ifdef __cplusplus
00014 extern "C" {
00015 #endif
00016
00017 #include <stdio.h>
00018
00019 #ifndef __INT64_DEFINED__
00020
00021 #ifdef WIN32
00022 typedef __int64 int64;
00023 typedef unsigned __int64 uint64;
00024 #else
00025 typedef long long int64;
00026 typedef unsigned long long uint64;
00027 #endif //WIN32
00028
00030 #define __INT64_DEFINED__
00031
00032 #endif //__INT64_DEFINED__
00033
00035
00038 #define EXA (1.E18)
00039
00042 #define PETA (1.E15)
00043
00046 #define TERA (1.E12)
00047
00050 #define GIGA (1.E9)
00051
00054 #define MEGA (1.E6)
00055
00058 #define KILO (1.E3)
00059
00062 #define MILLI (1.E-3)
00063
00066 #define MICRO (1.E-6)
00067
00070 #define NANO (1.E-9)
00071
00074 #define PICO (1.E-12)
00075
00078 #define FEMTO (1.E-15)
00079
00082 #define ATTO (1.E-18)
00083
00085
00087 #define ONE_DIV_3 (1.0 / 3.0)
00088
00090 #define ONE_DIV_4 (1.0 / 4.0)
00091
00093
00095 #define PI (3.1415926535897932384626433832795)
00096
00098 #define PI1 (PI / 180.0)
00099
00101 #define PI18 (PI / 10.0)
00102
00104 #define PI20 (PI / 9.0)
00105
00107 #define PI30 (PI / 6.0)
00108
00110 #define PI36 (PI / 5.0)
00111
00113 #define PI40 (2.0 * PI / 9.0)
00114
00116 #define PI45 (PI / 4.0)
00117
00119 #define PI54 (3.0 * PI / 10.0)
00120
00122 #define PI60 (PI / 3.0)
00123
00125 #define PI72 (2.0 * PI / 5.0)
00126
00128 #define PI90 (PI / 2.0)
00129
00131 #define PI108 (3.0 * PI / 5.0)
00132
00134 #define PI120 (2.0 * PI / 3.0)
00135
00137 #define PI135 (3.0 * PI / 4.0)
00138
00140 #define PI180 (PI)
00141
00143 #define PI240 (2.0 * PI120)
00144
00146 #define PI270 (3.0 * PI / 2.0)
00147
00149 #define PI360 (2.0 * PI)
00150
00152 #define DEG1 (180.0 / PI)
00153
00155 #define SQRT2 (1.4142135623730950488016887242097)
00156
00158 #define SQRT3 (1.7320508075688772935274463415059)
00159
00161
00164 typedef union
00165 {
00167
00168 int status;
00169
00170 #pragma warning( disable : 4201 )
00171 struct
00172 {
00174
00175 int undef : 1;
00176
00178
00180 int overflow : 1;
00181
00183
00184 int divideZero : 1;
00185
00187
00188 int zeroDivZero : 1;
00189
00191
00192 int baseExpZero : 1;
00193
00195
00196 int zeroExpNeg : 1;
00197
00199
00200 int negRadicand : 1;
00201
00203
00204 int trigonArcErr : 1;
00205
00207
00208 int trigonCotErr : 1;
00209
00211
00212 int rootExpZero : 1;
00213
00215
00216 int logBaseZero : 1;
00217
00219
00220 int logBaseOne : 1;
00221
00223
00224 int int64overflow : 1;
00225
00227
00228 int strErr : 1;
00229
00231
00232 int intPowNegExp : 1;
00233
00235
00236 int unused : 15;
00237
00239
00240 int underflow : 1;
00241
00243
00244 int negative : 1;
00245 };
00246
00247 #pragma warning( default : 4201 )
00248 }BM_STATUS;
00249
00251
00271 void printBM_STATUS( const BM_STATUS bms, FILE* file );
00272
00274
00290 int isDouble( const double* value, BM_STATUS* bms );
00291
00293
00309 int isI64( const int64* value, BM_STATUS* bms );
00310
00312
00323 double doubleAddDouble(
00324 const double augend,
00325 const double addend,
00326 BM_STATUS* bms );
00327
00329
00340 int64 i64AddI64(
00341 const int64 augend,
00342 const int64 addend,
00343 BM_STATUS* bms );
00344
00346
00357 double doubleSubDouble(
00358 const double minuend,
00359 const double subtrahend,
00360 BM_STATUS* bms );
00361
00363
00374 int64 i64SubI64(
00375 const int64 minuend,
00376 const int64 subtrahend,
00377 BM_STATUS* bms );
00378
00380
00391 double doubleMulDouble(
00392 const double multiplier,
00393 const double multiplicand,
00394 BM_STATUS* bms );
00395
00396
00398
00409 int64 i64MulI64(
00410 const int64 multiplier,
00411 const int64 multiplicand,
00412 BM_STATUS* bms );
00413
00415
00426 double doubleDivDouble(
00427 const double numerator,
00428 const double denominator,
00429 BM_STATUS* bms );
00430
00432
00443 int64 i64DivI64(
00444 const int64 numerator,
00445 const int64 denominator,
00446 BM_STATUS* bms );
00447
00449
00464 double doubleModDouble(
00465 const double numerator,
00466 const double denominator,
00467 BM_STATUS* bms );
00468
00470
00485 int64 i64ModI64(
00486 const int64 numerator,
00487 const int64 denominator,
00488 BM_STATUS* bms);
00489
00491
00501 double reciprocDouble(
00502 const double value,
00503 BM_STATUS* bms );
00504
00506
00533 double ceilDouble( const double value, BM_STATUS* bms );
00534
00536
00563 double floorDouble( const double value, BM_STATUS* bms );
00564
00566
00618 int64 doubleToInt64( const double value, double* intDbl, BM_STATUS* bms );
00619
00621
00628 double i64ToDouble( const int64 value );
00629
00631
00657 double roundDouble( const double value, const int decPlaces, BM_STATUS* bms );
00658
00660
00676 int doubleCompareDouble( const double value1, const double value2, const double diff, BM_STATUS* bms );
00677
00679
00687 int i64CompareI64( const int64 value1, const int64 value2, const int64 diff );
00688
00690
00697 int isEvenI64( const int64 value );
00698
00700
00715 double positiveDouble( const double value, BM_STATUS* bms );
00716
00718
00737 int64 positiveI64( const int64 value, BM_STATUS* bms );
00738
00740
00755 double negativeDouble( const double value, BM_STATUS* bms );
00756
00758
00768 int64 negativeI64( const int64 value );
00769
00771
00788 double invertSignDouble( const double value, BM_STATUS* bms );
00789
00791
00810 int64 invertSignI64( const int64 value, BM_STATUS* bms );
00811
00813
00824 double doublePow_2( const double base, BM_STATUS* bms );
00825
00827
00838 int64 i64Pow_2( const int64 base, BM_STATUS* bms );
00839
00841
00851 double doublePow_3( const double base, BM_STATUS* bms );
00852
00854
00864 int64 i64Pow_3( const int64 base, BM_STATUS* bms );
00865
00867
00877 double doublePow_4( const double base, BM_STATUS* bms );
00878
00880
00890 int64 i64Pow_4( const int64 base, BM_STATUS* bms );
00891
00893
00908 double doublePowDouble(
00909 const double base,
00910 const double exponent,
00911 BM_STATUS* bms );
00912
00914
00930 int64 i64PowI64(
00931 const int64 base,
00932 const int64 exponent,
00933 BM_STATUS* bms );
00934
00936
00948 double doubleRoot_2(
00949 const double radicand,
00950 BM_STATUS* bms );
00951
00953
00965 int64 i64Root_2(const int64 radicand, BM_STATUS* bms);
00966
00968
00978 double doubleRoot_3(
00979 const double radicant,
00980 BM_STATUS* bms );
00981
00983
00993 double doubleRoot_4(
00994 const double radicant,
00995 BM_STATUS* bms );
00996
00998
01009 double doubleRootDouble(
01010 const double radicant,
01011 const double rootExponent,
01012 BM_STATUS* bms );
01013
01015
01026 int64 i64RootI64(
01027 const int64 radicant,
01028 const int64 rootExponent,
01029 BM_STATUS* bms );
01030
01032
01050 double doubleLogDouble(
01051 const double base,
01052 const double value,
01053 BM_STATUS* bms );
01054
01055
01057
01075 int64 i64LogI64(
01076 const int64 base,
01077 const int64 value,
01078 BM_STATUS* bms );
01079
01081
01093 void sortAscendantDouble(
01094 double* values,
01095 const unsigned long count,
01096 BM_STATUS* bms );
01097
01099
01106 void sortAscendantI64(
01107 int64* values,
01108 const unsigned long count );
01109
01111
01116 long doubleSolveP1norm(
01117 double* xr,
01118 const double* pf );
01119
01121
01126 long doubleSolveP1(
01127 double* xr,
01128 const double* pf );
01129
01131
01137 long doubleSolveP2norm(
01138 double* xr,
01139 const double* pf );
01140
01142
01148 long doubleSolveP2(
01149 double* xr,
01150 const double* pf );
01151
01153
01159 long doubleSolveP3norm(
01160 double* xr,
01161 const double* pf );
01162
01164
01170 long doubleSolveP3(
01171 double* xr,
01172 const double* pf );
01173
01175
01181 long doubleSolveP4norm(
01182 double* xr,
01183 const double* pf );
01184
01186
01192 long doubleSolveP4(
01193 double* xr,
01194 const double* pf );
01195
01197
01203 long doubleGetPolyFactors1(
01204 double* pf,
01205 const double* xz);
01206
01208
01215 BM_STATUS doubleGetPolyFactors2(
01216 double* pf,
01217 const double* xz);
01218
01220
01228 BM_STATUS doubleGetPolyFactors3(
01229 double* pf,
01230 const double* xz);
01231
01233
01242 BM_STATUS doubleGetPolyFactors4(
01243 double* pf,
01244 const double* xz);
01245
01247
01257 double deg2RadDouble( const double degree, BM_STATUS* bms );
01258
01260
01270 double rad2DegDouble( const double radian, BM_STATUS* bms );
01271
01273
01292 double stringToDouble( const char* stringValue, BM_STATUS* bms );
01293
01295
01317 int64 stringToI64( const char* stringValue, char** stopChar, BM_STATUS* bms );
01318
01320
01341 double strToDouble(
01342 const char* str,
01343 BM_STATUS* bms );
01344
01346
01358 BM_STATUS doubleSolveL1(
01359 double* xr,
01360 const double* lf );
01361
01363
01378 BM_STATUS doubleSolveL2(
01379 double* xr,
01380 double* lf[2] );
01381
01383
01401 void printDoubleBitpattern( double value, FILE* file );
01402
01404
01417 void printDoubleBitpatternFormatted( double value, FILE* file );
01418
01420
01438 double sinDouble( const double rad, BM_STATUS* bms );
01439
01441
01460 double asinDouble( const double value, BM_STATUS* bms );
01461
01463
01481 double cosDouble( const double rad, BM_STATUS* bms );
01482
01484
01503 double acosDouble( const double value, BM_STATUS* bms );
01504
01506
01529 double tanDouble( const double rad, BM_STATUS* bms );
01530
01532
01548 double atanDouble( const double value, BM_STATUS* bms );
01549
01551
01575 double cotDouble( const double rad, BM_STATUS* bms );
01576
01578
01601 double acotDouble( const double value, BM_STATUS* bms );
01602
01603
01605
01623 int findDouble( const double* element1, const unsigned int count, const double elem );
01624
01626
01644 int findI64( const __int64* element1, const unsigned int count, const __int64 elem );
01645
01646 #ifdef __cplusplus
01647 }
01648 #endif
01649
01650 #endif //__C_BASIC_MATH_H__