Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfunction.cGo 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
1.6.3
|