Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

function.c

Go to the documentation of this file.
00001 #include "calc.h"
00002 
00003 void apply_int_mask(calc_number_t *r)
00004 {
00005     unsigned __int64 mask;
00006 
00007     switch (calc.size) {
00008     case IDC_RADIO_QWORD:
00009         mask = _UI64_MAX;
00010         break;
00011     case IDC_RADIO_DWORD:
00012         mask = ULONG_MAX;
00013         break;
00014     case IDC_RADIO_WORD:
00015         mask = USHRT_MAX;
00016         break;
00017     case IDC_RADIO_BYTE:
00018         mask = UCHAR_MAX;
00019         break;
00020     default:
00021         mask = (unsigned __int64)-1;
00022     }
00023     r->i &= mask;
00024 }
00025 
00026 double asinh(double x)
00027 {
00028     return log(x+sqrt(x*x+1));
00029 }
00030 
00031 double acosh(double x)
00032 {
00033     // must be x>=1, if not return Nan (Not a Number)
00034     if(!(x>=1.0)) return sqrt(-1.0);
00035     
00036     // return only the positive result (as sqrt does).
00037     return log(x+sqrt(x*x-1.0));
00038 }
00039 
00040 double atanh(double x)
00041 {
00042     // must be x>-1, x<1, if not return Nan (Not a Number)
00043     if(!(x>-1.0 && x<1.0)) return sqrt(-1.0);
00044     
00045     return log((1.0+x)/(1.0-x))/2.0;
00046 }
00047 
00048 double validate_rad2angle(double a)
00049 {
00050     switch (calc.degr) {
00051     case IDC_RADIO_DEG:
00052         a = a * (180.0/CALC_PI);
00053         break;
00054     case IDC_RADIO_RAD:
00055         break;
00056     case IDC_RADIO_GRAD:
00057         a = a * (200.0/CALC_PI);
00058         break;
00059     }
00060     return a;
00061 }
00062 
00063 double validate_angle2rad(calc_number_t *c)
00064 {
00065     switch (calc.degr) {
00066     case IDC_RADIO_DEG:
00067         c->f = c->f * (CALC_PI/180.0);
00068         break;
00069     case IDC_RADIO_RAD:
00070         break;
00071     case IDC_RADIO_GRAD:
00072         c->f = c->f * (CALC_PI/200.0);
00073         break;
00074     }
00075     return c->f;
00076 }
00077 
00078 void rpn_sin(calc_number_t *c)
00079 {
00080     double angle = validate_angle2rad(c);
00081 
00082     if (angle == 0 || angle == CALC_PI)
00083         c->f = 0;
00084     else
00085     if (angle == CALC_3_PI_2)
00086         c->f = -1;
00087     else
00088     if (angle == CALC_2_PI)
00089         c->f = 1;
00090     else
00091         c->f = sin(angle);
00092 }
00093 void rpn_cos(calc_number_t *c)
00094 {
00095     double angle = validate_angle2rad(c);
00096 
00097     if (angle == CALC_PI_2 || angle == CALC_3_PI_2)
00098         c->f = 0;
00099     else
00100     if (angle == CALC_PI)
00101         c->f = -1;
00102     else
00103     if (angle == CALC_2_PI)
00104         c->f = 1;
00105     else
00106         c->f = cos(angle);
00107 }
00108 void rpn_tan(calc_number_t *c)
00109 {
00110     double angle = validate_angle2rad(c);
00111 
00112     if (angle == CALC_PI_2 || angle == CALC_3_PI_2)
00113         calc.is_nan = TRUE;
00114     else
00115     if (angle == CALC_PI || angle == CALC_2_PI)
00116         c->f = 0;
00117     else
00118         c->f = tan(angle);
00119 }
00120 
00121 void rpn_asin(calc_number_t *c)
00122 {
00123     c->f = validate_rad2angle(asin(c->f));
00124     if (_isnan(c->f))
00125         calc.is_nan = TRUE;
00126 }
00127 void rpn_acos(calc_number_t *c)
00128 {
00129     c->f = validate_rad2angle(acos(c->f));
00130     if (_isnan(c->f))
00131         calc.is_nan = TRUE;
00132 }
00133 void rpn_atan(calc_number_t *c)
00134 {
00135     c->f = validate_rad2angle(atan(c->f));
00136     if (_isnan(c->f))
00137         calc.is_nan = TRUE;
00138 }
00139 
00140 void rpn_sinh(calc_number_t *c)
00141 {
00142     c->f = sinh(c->f);
00143     if (_isnan(c->f))
00144         calc.is_nan = TRUE;
00145 }
00146 void rpn_cosh(calc_number_t *c)
00147 {
00148     c->f = cosh(c->f);
00149     if (_isnan(c->f))
00150         calc.is_nan = TRUE;
00151 }
00152 void rpn_tanh(calc_number_t *c)
00153 {
00154     c->f = tanh(c->f);
00155     if (_isnan(c->f))
00156         calc.is_nan = TRUE;
00157 }
00158 
00159 void rpn_asinh(calc_number_t *c)
00160 {
00161     c->f = asinh(c->f);
00162     if (_isnan(c->f))
00163         calc.is_nan = TRUE;
00164 }
00165 void rpn_acosh(calc_number_t *c)
00166 {
00167     c->f = acosh(c->f);
00168     if (_isnan(c->f))
00169         calc.is_nan = TRUE;
00170 }
00171 void rpn_atanh(calc_number_t *c)
00172 {
00173     c->f = atanh(c->f);
00174     if (_isnan(c->f))
00175         calc.is_nan = TRUE;
00176 }
00177 
00178 void rpn_int(calc_number_t *c)
00179 {
00180     double int_part;
00181 
00182     modf(calc.code.f, &int_part);
00183     c->f = int_part;
00184 }
00185 
00186 void rpn_frac(calc_number_t *c)
00187 {
00188     double int_part;
00189 
00190     c->f = modf(calc.code.f, &int_part);
00191 }
00192 
00193 void rpn_reci(calc_number_t *c)
00194 {
00195     if (c->f == 0)
00196         calc.is_nan = TRUE;
00197     else
00198         c->f = 1./c->f;
00199 }
00200 
00201 void rpn_fact(calc_number_t *c)
00202 {
00203     double fact, mult, num;
00204 
00205     if (calc.base == IDC_RADIO_DEC)
00206         num = c->f;
00207     else
00208         num = (double)c->i;
00209     if (num > 1000) {
00210         calc.is_nan = TRUE;
00211         return;
00212     }
00213     if (num < 0) {
00214         calc.is_nan = TRUE;
00215         return;
00216     } else
00217     if (num == 0)
00218         fact = 1;
00219     else {
00220         rpn_int(c);
00221         fact = 1;
00222         mult = 2;
00223         while (mult <= num) {
00224             fact *= mult;
00225             mult++;
00226         }
00227         c->f = fact;
00228     }
00229     if (_finite(fact) == 0)
00230         calc.is_nan = TRUE;
00231     else
00232     if (calc.base == IDC_RADIO_DEC)
00233         c->f = fact;
00234     else
00235         c->i = (__int64)fact;
00236 }
00237 
00238 __int64 logic_dbl2int(calc_number_t *a)
00239 {
00240     double   int_part;
00241     int      width;
00242 
00243     modf(a->f, &int_part);
00244     width = (int_part==0) ? 1 : (int)log10(fabs(int_part))+1;
00245     if (width > 63) {
00246         calc.is_nan = TRUE;
00247         return 0;
00248     }
00249     return (__int64)int_part;
00250 }
00251 double logic_int2dbl(calc_number_t *a)
00252 {
00253     return (double)a->i;
00254 }
00255 
00256 void rpn_not(calc_number_t *c)
00257 {
00258     if (calc.base == IDC_RADIO_DEC) {
00259         calc_number_t n;
00260         n.i = logic_dbl2int(c);
00261         c->f = (long double)(~n.i);
00262     } else
00263         c->i = ~c->i;
00264 }
00265 
00266 void rpn_pi(calc_number_t *c)
00267 {
00268     c->f = CALC_PI;
00269 }
00270 
00271 void rpn_2pi(calc_number_t *c)
00272 {
00273     c->f = CALC_PI*2;
00274 }
00275 
00276 void rpn_sign(calc_number_t *c)
00277 {
00278     if (calc.base == IDC_RADIO_DEC)
00279         c->f = 0-c->f;
00280     else
00281         c->i = 0-c->i;
00282 }
00283 
00284 void rpn_exp2(calc_number_t *c)
00285 {
00286     if (calc.base == IDC_RADIO_DEC) {
00287         c->f *= c->f;
00288         if (_finite(c->f) == 0)
00289             calc.is_nan = TRUE;
00290     } else
00291         c->i *= c->i;
00292 }
00293 
00294 void rpn_exp3(calc_number_t *c)
00295 {
00296     if (calc.base == IDC_RADIO_DEC) {
00297         c->f = pow(c->f, 3.);
00298         if (_finite(c->f) == 0)
00299             calc.is_nan = TRUE;
00300     } else
00301         c->i *= (c->i*c->i);
00302 }
00303 
00304 static __int64 myabs64(__int64 number)
00305 {
00306     return (number < 0) ? 0-number : number;
00307 }
00308 
00309 static unsigned __int64 sqrti(unsigned __int64 number)
00310 {
00311 /* modified form of Newton's method for approximating roots */
00312 #define NEXT(n, i)  (((n) + (i)/(n)) >> 1)
00313     unsigned __int64 n, n1;
00314 
00315 #ifdef __GNUC__
00316     if (number == 0xffffffffffffffffLL)
00317 #else
00318     if (number == 0xffffffffffffffff)
00319 #endif
00320         return 0xffffffff;
00321 
00322     n  = 1;
00323     n1 = NEXT(n, number);
00324     while (myabs64(n1 - n) > 1) {
00325         n  = n1;
00326         n1 = NEXT(n, number);
00327     }
00328     while((n1*n1) > number)
00329         n1--;
00330     return n1;
00331 #undef NEXT
00332 }
00333 
00334 void rpn_sqrt(calc_number_t *c)
00335 {
00336     if (calc.base == IDC_RADIO_DEC) {
00337         if (c->f < 0)
00338             calc.is_nan = TRUE;
00339         else
00340             c->f = sqrt(c->f);
00341     } else {
00342         c->i = sqrti(c->i);
00343     }
00344 }
00345 
00346 static __int64 cbrti(__int64 x) {
00347    __int64 s, y, b;
00348 
00349    s = 60;
00350    y = 0;
00351    while(s >= 0) { 
00352       y = 2*y;
00353       b = (3*y*(y + 1) + 1) << s;
00354       s = s - 3;
00355       if (x >= b) {
00356          x = x - b;
00357          y = y + 1;
00358       }
00359    }
00360    return y;
00361 }
00362 
00363 void rpn_cbrt(calc_number_t *c)
00364 {
00365     if (calc.base == IDC_RADIO_DEC)
00366 #if defined(__GNUC__) && !defined(__REACTOS__)
00367         c->f = cbrt(c->f);
00368 #else
00369         c->f = pow(c->f,1./3.);
00370 #endif
00371     else {
00372         c->i = cbrti(c->i);
00373     }
00374 }
00375 
00376 void rpn_exp(calc_number_t *c)
00377 {
00378     c->f = exp(c->f);
00379     if (_finite(c->f) == 0)
00380         calc.is_nan = TRUE;
00381 }
00382 
00383 void rpn_exp10(calc_number_t *c)
00384 {
00385     double int_part;
00386 
00387     modf(c->f, &int_part);
00388     if (fmod(int_part, 2.) == 0.)
00389         calc.is_nan = TRUE;
00390     else {
00391         c->f = pow(10., c->f);
00392         if (_finite(c->f) == 0)
00393             calc.is_nan = TRUE;
00394     }
00395 }
00396 
00397 void rpn_ln(calc_number_t *c)
00398 {
00399     if (c->f <= 0)
00400         calc.is_nan = TRUE;
00401     else
00402         c->f = log(c->f);
00403 }
00404 
00405 void rpn_log(calc_number_t *c)
00406 {
00407     if (c->f <= 0)
00408         calc.is_nan = TRUE;
00409     else
00410         c->f = log10(c->f);
00411 }
00412 
00413 static double stat_sum(void)
00414 {
00415     double       sum = 0;
00416     statistic_t *p = calc.stat;
00417 
00418     while (p != NULL) {
00419         if (p->base == IDC_RADIO_DEC)
00420             sum += p->num.f;
00421         else
00422             sum += p->num.i;
00423         p = (statistic_t *)(p->next);
00424     }
00425     return sum;
00426 }
00427 
00428 void rpn_ave(calc_number_t *c)
00429 {
00430     double       ave = 0;
00431     int          n;
00432 
00433     ave = stat_sum();
00434     n = SendDlgItemMessage(calc.hStatWnd, IDC_LIST_STAT, LB_GETCOUNT, 0, 0);
00435 
00436     if (n)
00437         ave = ave / (double)n;
00438     if (calc.base == IDC_RADIO_DEC)
00439         c->f = ave;
00440     else
00441         c->i = (__int64)ave;
00442 }
00443 
00444 void rpn_sum(calc_number_t *c)
00445 {
00446     double sum = stat_sum();
00447 
00448     if (calc.base == IDC_RADIO_DEC)
00449         c->f = sum;
00450     else
00451         c->i = (__int64)sum;
00452 }
00453 
00454 static void rpn_s_ex(calc_number_t *c, int pop_type)
00455 {
00456     double       ave = 0;
00457     double       n = 0;
00458     double       dev = 0;
00459     double       num = 0;
00460     statistic_t *p = calc.stat;
00461 
00462     ave = stat_sum();
00463     n = (double)SendDlgItemMessage(calc.hStatWnd, IDC_LIST_STAT, LB_GETCOUNT, 0, 0);
00464 
00465     if (n == 0) {
00466         c->f = 0;
00467         return;
00468     }
00469     ave = ave / n;
00470 
00471     dev = 0;
00472     p = calc.stat;
00473     while (p != NULL) {
00474         if (p->base == IDC_RADIO_DEC)
00475             num = p->num.f;
00476         else
00477             num = (double)p->num.i;
00478         dev += pow(num-ave, 2.);
00479         p = (statistic_t *)(p->next);
00480     }
00481     dev = sqrt(dev/(pop_type ? n-1 : n));
00482     if (calc.base == IDC_RADIO_DEC)
00483         c->f = dev;
00484     else
00485         c->i = (__int64)dev;
00486 }
00487 
00488 void rpn_s(calc_number_t *c)
00489 {
00490     rpn_s_ex(c, 0);
00491 }
00492 
00493 void rpn_s_m1(calc_number_t *c)
00494 {
00495     rpn_s_ex(c, 1);
00496 }
00497 
00498 void rpn_dms2dec(calc_number_t *c)
00499 {
00500     double d, m, s;
00501 
00502     m = modf(c->f, &d) * 100;
00503     s = (modf(m, &m) * 100)+.5;
00504     modf(s, &s);
00505 
00506     m = m/60;
00507     s = s/3600;
00508 
00509     c->f = d + m + s;
00510 }
00511 
00512 void rpn_dec2dms(calc_number_t *c)
00513 {
00514     double d, m, s;
00515 
00516     m = modf(c->f, &d) * 60;
00517     s = ceil(modf(m, &m) * 60);
00518     c->f = d + m/100. + s/10000.;
00519 }
00520 
00521 void rpn_zero(calc_number_t *c)
00522 {
00523     c->f = 0;
00524 }
00525 
00526 void rpn_copy(calc_number_t *dst, calc_number_t *src)
00527 {
00528     *dst = *src;
00529 }
00530 
00531 int rpn_is_zero(calc_number_t *c)
00532 {
00533     return (c->f == 0);
00534 }
00535 
00536 void rpn_alloc(calc_number_t *c)
00537 {
00538 }
00539 
00540 void rpn_free(calc_number_t *c)
00541 {
00542 }

Generated on Thu Feb 9 04:38:57 2012 for ReactOS by doxygen 1.6.3

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.