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

fun_mpfr.c

Go to the documentation of this file.
00001 #include "calc.h"
00002 
00003 void apply_int_mask(calc_number_t *r)
00004 {
00005     mpz_t a, mask;
00006 
00007     switch (calc.size) {
00008     case IDC_RADIO_QWORD:
00009         mpz_init_set_str(mask, "FFFFFFFFFFFFFFFF", 16);
00010         break;
00011     case IDC_RADIO_DWORD:
00012         mpz_init_set_str(mask, "00000000FFFFFFFF", 16);
00013         break;
00014     case IDC_RADIO_WORD:
00015         mpz_init_set_str(mask, "000000000000FFFF", 16);
00016         break;
00017     case IDC_RADIO_BYTE:
00018         mpz_init_set_str(mask, "00000000000000FF", 16);
00019         break;
00020     default:
00021         mpz_init_set_si(mask, -1);
00022     }
00023     mpz_init(a);
00024     mpfr_get_z(a, r->mf, MPFR_DEFAULT_RND);
00025     mpz_and(a, a, mask);
00026     mpfr_set_z(r->mf, a, MPFR_DEFAULT_RND);
00027     mpz_clear(a);
00028     mpz_clear(mask);
00029 }
00030 
00031 void validate_rad2angle(calc_number_t *r)
00032 {
00033     mpfr_t mult, divs;
00034 
00035     mpfr_init(mult);
00036     mpfr_init(divs);
00037     switch (calc.degr) {
00038     case IDC_RADIO_DEG:
00039         mpfr_set_ui(mult, 180, MPFR_DEFAULT_RND);
00040         mpfr_const_pi(divs, MPFR_DEFAULT_RND);
00041         break;
00042     case IDC_RADIO_RAD:
00043         mpfr_set_ui(mult, 1, MPFR_DEFAULT_RND);
00044         mpfr_set_ui(divs, 1, MPFR_DEFAULT_RND);
00045         break;
00046     case IDC_RADIO_GRAD:
00047         mpfr_set_ui(mult, 200, MPFR_DEFAULT_RND);
00048         mpfr_const_pi(divs, MPFR_DEFAULT_RND);
00049         break;
00050     }
00051     mpfr_mul(r->mf, r->mf, mult, MPFR_DEFAULT_RND);
00052     mpfr_div(r->mf, r->mf, divs, MPFR_DEFAULT_RND);
00053 
00054     mpfr_clear(mult);
00055     mpfr_clear(divs);
00056 }
00057 
00058 void validate_angle2rad(calc_number_t *r)
00059 {
00060     mpfr_t mult, divs;
00061 
00062     if (!mpfr_number_p(r->mf)) {
00063         calc.is_nan = TRUE;
00064         return;
00065     }
00066     mpfr_init(mult);
00067     mpfr_init(divs);
00068     switch (calc.degr) {
00069     case IDC_RADIO_DEG:
00070         mpfr_const_pi(mult, MPFR_DEFAULT_RND);
00071         mpfr_set_ui(divs, 180, MPFR_DEFAULT_RND);
00072         break;
00073     case IDC_RADIO_RAD:
00074         mpfr_set_ui(mult, 1, MPFR_DEFAULT_RND);
00075         mpfr_set_ui(divs, 1, MPFR_DEFAULT_RND);
00076         break;
00077     case IDC_RADIO_GRAD:
00078         mpfr_const_pi(mult, MPFR_DEFAULT_RND);
00079         mpfr_set_ui(divs, 200, MPFR_DEFAULT_RND);
00080         break;
00081     }
00082     mpfr_mul(r->mf, r->mf, mult, MPFR_DEFAULT_RND);
00083     mpfr_div(r->mf, r->mf, divs, MPFR_DEFAULT_RND);
00084 
00085     mpfr_clear(mult);
00086     mpfr_clear(divs);
00087 }
00088 
00089 static void build_rad_const(
00090     mpfr_t *mp_pi,
00091     mpfr_t *mp_pi_2,
00092     mpfr_t *mp_3_pi_2,
00093     mpfr_t *mp_2_pi)
00094 {
00095     mpfr_init(*mp_pi);
00096     mpfr_init(*mp_pi_2);
00097     mpfr_init(*mp_3_pi_2);
00098     mpfr_init(*mp_2_pi);
00099     mpfr_const_pi(*mp_pi, MPFR_DEFAULT_RND);
00100     mpfr_div_ui(*mp_pi_2, *mp_pi, 2, MPFR_DEFAULT_RND);
00101     mpfr_mul_ui(*mp_3_pi_2, *mp_pi, 3, MPFR_DEFAULT_RND);
00102     mpfr_div_ui(*mp_3_pi_2, *mp_3_pi_2, 2, MPFR_DEFAULT_RND);
00103     mpfr_mul_ui(*mp_2_pi, *mp_pi, 2, MPFR_DEFAULT_RND);
00104 }
00105 
00106 void rpn_sin(calc_number_t *c)
00107 {
00108     mpfr_t mp_pi, mp_pi_2, mp_3_pi_2, mp_2_pi;
00109 
00110     validate_angle2rad(c);
00111     build_rad_const(&mp_pi, &mp_pi_2, &mp_3_pi_2, &mp_2_pi);
00112 
00113     if (rpn_is_zero(c) || !mpfr_cmp(c->mf, mp_pi) || !mpfr_cmp(c->mf, mp_2_pi))
00114         rpn_zero(c);
00115     else
00116     if (!mpfr_cmp(c->mf, mp_3_pi_2))
00117         mpfr_set_si(c->mf, -1, MPFR_DEFAULT_RND);
00118     else
00119     if (!mpfr_cmp(c->mf, mp_pi_2))
00120         mpfr_set_si(c->mf, 1, MPFR_DEFAULT_RND);
00121     else {
00122         mpfr_sin(c->mf, c->mf, MPFR_DEFAULT_RND);
00123         if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00124     }
00125     mpfr_clear(mp_pi);
00126     mpfr_clear(mp_pi_2);
00127     mpfr_clear(mp_3_pi_2);
00128     mpfr_clear(mp_2_pi);
00129 }
00130 void rpn_cos(calc_number_t *c)
00131 {
00132     mpfr_t mp_pi, mp_pi_2, mp_3_pi_2, mp_2_pi;
00133 
00134     validate_angle2rad(c);
00135     build_rad_const(&mp_pi, &mp_pi_2, &mp_3_pi_2, &mp_2_pi);
00136 
00137     if (!mpfr_cmp(c->mf, mp_pi_2) || !mpfr_cmp(c->mf, mp_3_pi_2))
00138         rpn_zero(c);
00139     else
00140     if (!mpfr_cmp(c->mf, mp_pi))
00141         mpfr_set_si(c->mf, -1, MPFR_DEFAULT_RND);
00142     else
00143     if (!mpfr_cmp(c->mf, mp_2_pi))
00144         mpfr_set_si(c->mf, 1, MPFR_DEFAULT_RND);
00145     else {
00146         mpfr_cos(c->mf, c->mf, MPFR_DEFAULT_RND);
00147         if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00148     }
00149     mpfr_clear(mp_pi);
00150     mpfr_clear(mp_pi_2);
00151     mpfr_clear(mp_3_pi_2);
00152     mpfr_clear(mp_2_pi);
00153 }
00154 void rpn_tan(calc_number_t *c)
00155 {
00156     mpfr_t mp_pi, mp_pi_2, mp_3_pi_2, mp_2_pi;
00157 
00158     validate_angle2rad(c);
00159     build_rad_const(&mp_pi, &mp_pi_2, &mp_3_pi_2, &mp_2_pi);
00160 
00161     if (!mpfr_cmp(c->mf, mp_pi_2) || !mpfr_cmp(c->mf, mp_3_pi_2))
00162         calc.is_nan = TRUE;
00163     else
00164     if (!mpfr_cmp(c->mf, mp_pi) || !mpfr_cmp(c->mf, mp_2_pi))
00165         rpn_zero(c);
00166     else {
00167         mpfr_tan(c->mf, c->mf, MPFR_DEFAULT_RND);
00168         if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00169     }
00170     mpfr_clear(mp_pi);
00171     mpfr_clear(mp_pi_2);
00172     mpfr_clear(mp_3_pi_2);
00173     mpfr_clear(mp_2_pi);
00174 }
00175 
00176 void rpn_asin(calc_number_t *c)
00177 {
00178     mpfr_asin(c->mf, c->mf, MPFR_DEFAULT_RND);
00179     validate_rad2angle(c);
00180 }
00181 void rpn_acos(calc_number_t *c)
00182 {
00183     mpfr_acos(c->mf, c->mf, MPFR_DEFAULT_RND);
00184     validate_rad2angle(c);
00185 }
00186 void rpn_atan(calc_number_t *c)
00187 {
00188     mpfr_atan(c->mf, c->mf, MPFR_DEFAULT_RND);
00189     validate_rad2angle(c);
00190 }
00191 
00192 void rpn_sinh(calc_number_t *c)
00193 {
00194     mpfr_sinh(c->mf, c->mf, MPFR_DEFAULT_RND);
00195     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00196 }
00197 void rpn_cosh(calc_number_t *c)
00198 {
00199     mpfr_cosh(c->mf, c->mf, MPFR_DEFAULT_RND);
00200     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00201 }
00202 void rpn_tanh(calc_number_t *c)
00203 {
00204     mpfr_tanh(c->mf, c->mf, MPFR_DEFAULT_RND);
00205     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00206 }
00207 
00208 void rpn_asinh(calc_number_t *c)
00209 {
00210     mpfr_asinh(c->mf, c->mf, MPFR_DEFAULT_RND);
00211     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00212 }
00213 void rpn_acosh(calc_number_t *c)
00214 {
00215     mpfr_acosh(c->mf, c->mf, MPFR_DEFAULT_RND);
00216     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00217 }
00218 void rpn_atanh(calc_number_t *c)
00219 {
00220     mpfr_atanh(c->mf, c->mf, MPFR_DEFAULT_RND);
00221     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00222 }
00223 
00224 void rpn_int(calc_number_t *c)
00225 {
00226     mpfr_trunc(c->mf, c->mf);
00227 }
00228 
00229 void rpn_frac(calc_number_t *c)
00230 {
00231     mpfr_frac(c->mf, c->mf, MPFR_DEFAULT_RND);
00232 }
00233 
00234 void rpn_reci(calc_number_t *c)
00235 {
00236     if (mpfr_sgn(c->mf) == 0)
00237         calc.is_nan = TRUE;
00238     else
00239         mpfr_ui_div(c->mf, 1, c->mf, MPFR_DEFAULT_RND);
00240 }
00241 
00242 void rpn_fact(calc_number_t *c)
00243 {
00244     if (mpfr_sgn(c->mf) < 0) {
00245         calc.is_nan = TRUE;
00246         return;
00247     }
00248 
00249     mpfr_trunc(c->mf, c->mf);
00250     if (mpfr_fits_ulong_p(c->mf, MPFR_DEFAULT_RND) == 0)
00251         calc.is_nan = TRUE;
00252     else {
00253         mpfr_fac_ui(c->mf, mpfr_get_ui(c->mf, MPFR_DEFAULT_RND), MPFR_DEFAULT_RND);
00254         if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00255     }
00256 }
00257 
00258 void rpn_not(calc_number_t *c)
00259 {
00260     mpz_t a;
00261 
00262     mpz_init(a);
00263     mpfr_get_z(a, c->mf, MPFR_DEFAULT_RND);
00264     mpz_com(a, a);
00265     mpfr_set_z(c->mf, a, MPFR_DEFAULT_RND);
00266     mpz_clear(a);
00267 }
00268 
00269 void rpn_pi(calc_number_t *c)
00270 {
00271     mpfr_const_pi(c->mf, MPFR_DEFAULT_RND);
00272 }
00273 
00274 void rpn_2pi(calc_number_t *c)
00275 {
00276     mpfr_const_pi(c->mf, MPFR_DEFAULT_RND);
00277     mpfr_mul_ui(c->mf, c->mf, 2, MPFR_DEFAULT_RND);
00278 }
00279 
00280 void rpn_sign(calc_number_t *c)
00281 {
00282     mpfr_mul_si(c->mf, c->mf, -1, MPFR_DEFAULT_RND);
00283 }
00284 
00285 void rpn_exp2(calc_number_t *c)
00286 {
00287     mpfr_sqr(c->mf, c->mf, MPFR_DEFAULT_RND);
00288     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00289 }
00290 
00291 void rpn_exp3(calc_number_t *c)
00292 {
00293     mpfr_pow_ui(c->mf, c->mf, 3, MPFR_DEFAULT_RND);
00294     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00295 }
00296 
00297 void rpn_sqrt(calc_number_t *c)
00298 {
00299     mpfr_sqrt(c->mf, c->mf, MPFR_DEFAULT_RND);
00300     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00301 }
00302 
00303 void rpn_cbrt(calc_number_t *c)
00304 {
00305     mpfr_cbrt(c->mf, c->mf, MPFR_DEFAULT_RND);
00306     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00307 }
00308 
00309 void rpn_exp(calc_number_t *c)
00310 {
00311     mpfr_exp(c->mf, c->mf, MPFR_DEFAULT_RND);
00312     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00313 }
00314 
00315 void rpn_exp10(calc_number_t *c)
00316 {
00317     mpfr_exp10(c->mf, c->mf, MPFR_DEFAULT_RND);
00318     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00319 }
00320 
00321 void rpn_ln(calc_number_t *c)
00322 {
00323     mpfr_log(c->mf, c->mf, MPFR_DEFAULT_RND);
00324     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00325 }
00326 
00327 void rpn_log(calc_number_t *c)
00328 {
00329     mpfr_log10(c->mf, c->mf, MPFR_DEFAULT_RND);
00330     if (!mpfr_number_p(c->mf)) calc.is_nan = TRUE;
00331 }
00332 
00333 static void stat_sum(mpfr_t sum)
00334 {
00335     statistic_t *p = calc.stat;
00336 
00337     mpfr_set_ui(sum, 0, MPFR_DEFAULT_RND);
00338     while (p != NULL) {
00339         mpfr_add(sum, sum, p->num.mf, MPFR_DEFAULT_RND);
00340         p = (statistic_t *)(p->next);
00341     }
00342 }
00343 
00344 void rpn_ave(calc_number_t *c)
00345 {
00346     int     n;
00347 
00348     stat_sum(c->mf);
00349     n = SendDlgItemMessage(calc.hStatWnd, IDC_LIST_STAT, LB_GETCOUNT, 0, 0);
00350 
00351     if (n)
00352         mpfr_div_ui(c->mf, c->mf, n, MPFR_DEFAULT_RND);
00353 
00354     if (calc.base != IDC_RADIO_DEC)
00355         mpfr_trunc(c->mf, c->mf);
00356 }
00357 
00358 void rpn_sum(calc_number_t *c)
00359 {
00360     stat_sum(c->mf);
00361 
00362     if (calc.base != IDC_RADIO_DEC)
00363         mpfr_trunc(c->mf, c->mf);
00364 }
00365 
00366 static void rpn_s_ex(calc_number_t *c, int pop_type)
00367 {
00368     mpfr_t        dev;
00369     mpfr_t        num;
00370     unsigned long n = 0;
00371     statistic_t  *p = calc.stat;
00372 
00373     n = SendDlgItemMessage(calc.hStatWnd, IDC_LIST_STAT, LB_GETCOUNT, 0, 0);
00374     if (n < 2) {
00375         mpfr_set_ui(c->mf, 0, MPFR_DEFAULT_RND);
00376         return;
00377     }
00378 
00379     stat_sum(c->mf);
00380     mpfr_div_ui(c->mf, c->mf, n, MPFR_DEFAULT_RND);
00381 
00382     mpfr_init(dev);
00383     mpfr_init(num);
00384 
00385     mpfr_set_ui(dev, 0, MPFR_DEFAULT_RND);
00386     p = calc.stat;
00387     while (p != NULL) {
00388         mpfr_sub(num, p->num.mf, c->mf, MPFR_DEFAULT_RND);
00389         mpfr_sqr(num, num, MPFR_DEFAULT_RND);
00390         mpfr_add(dev, dev, num, MPFR_DEFAULT_RND);
00391         p = (statistic_t *)(p->next);
00392     }
00393     mpfr_div_ui(c->mf, dev, pop_type ? n-1 : n, MPFR_DEFAULT_RND);
00394     mpfr_sqrt(c->mf, c->mf, MPFR_DEFAULT_RND);
00395 
00396     if (calc.base != IDC_RADIO_DEC)
00397         mpfr_trunc(c->mf, c->mf);
00398 
00399     mpfr_clear(dev);
00400     mpfr_clear(num);
00401 }
00402 
00403 void rpn_s(calc_number_t *c)
00404 {
00405     rpn_s_ex(c, 0);
00406 }
00407 
00408 void rpn_s_m1(calc_number_t *c)
00409 {
00410     rpn_s_ex(c, 1);
00411 }
00412 
00413 void rpn_dms2dec(calc_number_t *c)
00414 {
00415     mpfr_t d, m, s;
00416 
00417     mpfr_init(d);
00418     mpfr_init(m);
00419     mpfr_init(s);
00420 
00421     mpfr_trunc(d, c->mf);
00422     mpfr_frac(m, c->mf, MPFR_DEFAULT_RND);
00423     mpfr_mul_ui(m, m, 100, MPFR_DEFAULT_RND);
00424 
00425     mpfr_frac(s, m, MPFR_DEFAULT_RND);
00426     mpfr_trunc(m, m);
00427     mpfr_mul_ui(s, s, 100, MPFR_DEFAULT_RND);
00428     mpfr_ceil(s, s);
00429 
00430     mpfr_div_ui(m, m, 60, MPFR_DEFAULT_RND);
00431     mpfr_div_ui(s, s, 3600, MPFR_DEFAULT_RND);
00432     mpfr_add(c->mf, d, m, MPFR_DEFAULT_RND);
00433     mpfr_add(c->mf, c->mf, s, MPFR_DEFAULT_RND);
00434 
00435     mpfr_clear(d);
00436     mpfr_clear(m);
00437     mpfr_clear(s);
00438 }
00439 
00440 void rpn_dec2dms(calc_number_t *c)
00441 {
00442     mpfr_t d, m, s;
00443 
00444     mpfr_init(d);
00445     mpfr_init(m);
00446     mpfr_init(s);
00447 
00448     mpfr_trunc(d, c->mf);
00449     mpfr_frac(m, c->mf, MPFR_DEFAULT_RND);
00450     mpfr_mul_ui(m, m, 60, MPFR_DEFAULT_RND);
00451 
00452     mpfr_frac(s, m, MPFR_DEFAULT_RND);
00453     mpfr_trunc(m, m);
00454     mpfr_mul_ui(s, s, 60, MPFR_DEFAULT_RND);
00455     mpfr_ceil(s, s);
00456 
00457     mpfr_div_ui(m, m, 100, MPFR_DEFAULT_RND);
00458     mpfr_div_ui(s, s, 10000, MPFR_DEFAULT_RND);
00459     mpfr_add(c->mf, d, m, MPFR_DEFAULT_RND);
00460     mpfr_add(c->mf, c->mf, s, MPFR_DEFAULT_RND);
00461 
00462     mpfr_clear(d);
00463     mpfr_clear(m);
00464     mpfr_clear(s);
00465 }
00466 
00467 void rpn_zero(calc_number_t *c)
00468 {
00469     mpfr_set_ui(c->mf, 0, MPFR_DEFAULT_RND);
00470 }
00471 
00472 void rpn_copy(calc_number_t *dst, calc_number_t *src)
00473 {
00474     mpfr_set(dst->mf, src->mf, MPFR_DEFAULT_RND);
00475 }
00476 
00477 int rpn_is_zero(calc_number_t *c)
00478 {
00479     return (mpfr_sgn(c->mf) == 0);
00480 }
00481 
00482 void rpn_alloc(calc_number_t *c)
00483 {
00484     mpfr_init(c->mf);
00485 }
00486 
00487 void rpn_free(calc_number_t *c)
00488 {
00489     mpfr_clear(c->mf);
00490 }

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.