4 void apply_int_mask(calc_number_t
*r
)
10 mpz_init_set_str(mask
, "FFFFFFFFFFFFFFFF", 16);
13 mpz_init_set_str(mask
, "00000000FFFFFFFF", 16);
16 mpz_init_set_str(mask
, "000000000000FFFF", 16);
19 mpz_init_set_str(mask
, "00000000000000FF", 16);
22 mpz_init_set_si(mask
, -1);
25 mpfr_get_z(a
, r
->mf
, MPFR_DEFAULT_RND
);
27 mpfr_set_z(r
->mf
, a
, MPFR_DEFAULT_RND
);
32 void validate_rad2angle(calc_number_t
*r
)
40 mpfr_set_ui(mult
, 180, MPFR_DEFAULT_RND
);
41 mpfr_const_pi(divs
, MPFR_DEFAULT_RND
);
44 mpfr_set_ui(mult
, 1, MPFR_DEFAULT_RND
);
45 mpfr_set_ui(divs
, 1, MPFR_DEFAULT_RND
);
48 mpfr_set_ui(mult
, 200, MPFR_DEFAULT_RND
);
49 mpfr_const_pi(divs
, MPFR_DEFAULT_RND
);
52 mpfr_mul(r
->mf
, r
->mf
, mult
, MPFR_DEFAULT_RND
);
53 mpfr_div(r
->mf
, r
->mf
, divs
, MPFR_DEFAULT_RND
);
59 void validate_angle2rad(calc_number_t
*r
)
63 if (!mpfr_number_p(r
->mf
)) {
71 mpfr_const_pi(mult
, MPFR_DEFAULT_RND
);
72 mpfr_set_ui(divs
, 180, MPFR_DEFAULT_RND
);
75 mpfr_set_ui(mult
, 1, MPFR_DEFAULT_RND
);
76 mpfr_set_ui(divs
, 1, MPFR_DEFAULT_RND
);
79 mpfr_const_pi(mult
, MPFR_DEFAULT_RND
);
80 mpfr_set_ui(divs
, 200, MPFR_DEFAULT_RND
);
83 mpfr_mul(r
->mf
, r
->mf
, mult
, MPFR_DEFAULT_RND
);
84 mpfr_div(r
->mf
, r
->mf
, divs
, MPFR_DEFAULT_RND
);
90 static void build_rad_const(
98 mpfr_init(*mp_3_pi_2
);
100 mpfr_const_pi(*mp_pi
, MPFR_DEFAULT_RND
);
101 mpfr_div_ui(*mp_pi_2
, *mp_pi
, 2, MPFR_DEFAULT_RND
);
102 mpfr_mul_ui(*mp_3_pi_2
, *mp_pi
, 3, MPFR_DEFAULT_RND
);
103 mpfr_div_ui(*mp_3_pi_2
, *mp_3_pi_2
, 2, MPFR_DEFAULT_RND
);
104 mpfr_mul_ui(*mp_2_pi
, *mp_pi
, 2, MPFR_DEFAULT_RND
);
107 void rpn_sin(calc_number_t
*c
)
109 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
111 validate_angle2rad(c
);
112 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
114 if (rpn_is_zero(c
) || !mpfr_cmp(c
->mf
, mp_pi
) || !mpfr_cmp(c
->mf
, mp_2_pi
))
117 if (!mpfr_cmp(c
->mf
, mp_3_pi_2
))
118 mpfr_set_si(c
->mf
, -1, MPFR_DEFAULT_RND
);
120 if (!mpfr_cmp(c
->mf
, mp_pi_2
))
121 mpfr_set_si(c
->mf
, 1, MPFR_DEFAULT_RND
);
123 mpfr_sin(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
124 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
128 mpfr_clear(mp_3_pi_2
);
131 void rpn_cos(calc_number_t
*c
)
133 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
135 validate_angle2rad(c
);
136 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
138 if (!mpfr_cmp(c
->mf
, mp_pi_2
) || !mpfr_cmp(c
->mf
, mp_3_pi_2
))
141 if (!mpfr_cmp(c
->mf
, mp_pi
))
142 mpfr_set_si(c
->mf
, -1, MPFR_DEFAULT_RND
);
144 if (!mpfr_cmp(c
->mf
, mp_2_pi
))
145 mpfr_set_si(c
->mf
, 1, MPFR_DEFAULT_RND
);
147 mpfr_cos(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
148 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
152 mpfr_clear(mp_3_pi_2
);
155 void rpn_tan(calc_number_t
*c
)
157 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
159 validate_angle2rad(c
);
160 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
162 if (!mpfr_cmp(c
->mf
, mp_pi_2
) || !mpfr_cmp(c
->mf
, mp_3_pi_2
))
165 if (!mpfr_cmp(c
->mf
, mp_pi
) || !mpfr_cmp(c
->mf
, mp_2_pi
))
168 mpfr_tan(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
169 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
173 mpfr_clear(mp_3_pi_2
);
177 void rpn_asin(calc_number_t
*c
)
179 mpfr_asin(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
180 validate_rad2angle(c
);
182 void rpn_acos(calc_number_t
*c
)
184 mpfr_acos(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
185 validate_rad2angle(c
);
187 void rpn_atan(calc_number_t
*c
)
189 mpfr_atan(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
190 validate_rad2angle(c
);
193 void rpn_sinh(calc_number_t
*c
)
195 mpfr_sinh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
196 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
198 void rpn_cosh(calc_number_t
*c
)
200 mpfr_cosh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
201 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
203 void rpn_tanh(calc_number_t
*c
)
205 mpfr_tanh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
206 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
209 void rpn_asinh(calc_number_t
*c
)
211 mpfr_asinh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
212 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
214 void rpn_acosh(calc_number_t
*c
)
216 mpfr_acosh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
217 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
219 void rpn_atanh(calc_number_t
*c
)
221 mpfr_atanh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
222 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
225 void rpn_int(calc_number_t
*c
)
227 mpfr_trunc(c
->mf
, c
->mf
);
230 void rpn_frac(calc_number_t
*c
)
232 mpfr_frac(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
235 void rpn_reci(calc_number_t
*c
)
237 if (mpfr_sgn(c
->mf
) == 0)
240 mpfr_ui_div(c
->mf
, 1, c
->mf
, MPFR_DEFAULT_RND
);
243 void rpn_fact(calc_number_t
*c
)
245 if (mpfr_sgn(c
->mf
) < 0) {
250 mpfr_trunc(c
->mf
, c
->mf
);
251 if (mpfr_fits_ulong_p(c
->mf
, MPFR_DEFAULT_RND
) == 0)
254 mpfr_fac_ui(c
->mf
, mpfr_get_ui(c
->mf
, MPFR_DEFAULT_RND
), MPFR_DEFAULT_RND
);
255 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
259 void rpn_not(calc_number_t
*c
)
264 mpfr_get_z(a
, c
->mf
, MPFR_DEFAULT_RND
);
266 mpfr_set_z(c
->mf
, a
, MPFR_DEFAULT_RND
);
270 void rpn_pi(calc_number_t
*c
)
272 mpfr_const_pi(c
->mf
, MPFR_DEFAULT_RND
);
275 void rpn_2pi(calc_number_t
*c
)
277 mpfr_const_pi(c
->mf
, MPFR_DEFAULT_RND
);
278 mpfr_mul_ui(c
->mf
, c
->mf
, 2, MPFR_DEFAULT_RND
);
281 void rpn_sign(calc_number_t
*c
)
283 mpfr_mul_si(c
->mf
, c
->mf
, -1, MPFR_DEFAULT_RND
);
286 void rpn_exp2(calc_number_t
*c
)
288 mpfr_sqr(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
289 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
292 void rpn_exp3(calc_number_t
*c
)
294 mpfr_pow_ui(c
->mf
, c
->mf
, 3, MPFR_DEFAULT_RND
);
295 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
298 void rpn_sqrt(calc_number_t
*c
)
300 mpfr_sqrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
301 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
304 void rpn_cbrt(calc_number_t
*c
)
306 mpfr_cbrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
307 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
310 void rpn_exp(calc_number_t
*c
)
312 mpfr_exp(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
313 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
316 void rpn_exp10(calc_number_t
*c
)
318 mpfr_exp10(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
319 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
322 void rpn_ln(calc_number_t
*c
)
324 mpfr_log(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
325 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
328 void rpn_log(calc_number_t
*c
)
330 mpfr_log10(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
331 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
334 static void stat_sum(mpfr_t sum
)
336 statistic_t
*p
= calc
.stat
;
338 mpfr_set_ui(sum
, 0, MPFR_DEFAULT_RND
);
340 mpfr_add(sum
, sum
, p
->num
.mf
, MPFR_DEFAULT_RND
);
341 p
= (statistic_t
*)(p
->next
);
345 void rpn_ave(calc_number_t
*c
)
350 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
353 mpfr_div_ui(c
->mf
, c
->mf
, n
, MPFR_DEFAULT_RND
);
355 if (calc
.base
!= IDC_RADIO_DEC
)
356 mpfr_trunc(c
->mf
, c
->mf
);
359 void rpn_sum(calc_number_t
*c
)
363 if (calc
.base
!= IDC_RADIO_DEC
)
364 mpfr_trunc(c
->mf
, c
->mf
);
367 static void rpn_s_ex(calc_number_t
*c
, int pop_type
)
372 statistic_t
*p
= calc
.stat
;
374 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
376 mpfr_set_ui(c
->mf
, 0, MPFR_DEFAULT_RND
);
381 mpfr_div_ui(c
->mf
, c
->mf
, n
, MPFR_DEFAULT_RND
);
386 mpfr_set_ui(dev
, 0, MPFR_DEFAULT_RND
);
389 mpfr_sub(num
, p
->num
.mf
, c
->mf
, MPFR_DEFAULT_RND
);
390 mpfr_sqr(num
, num
, MPFR_DEFAULT_RND
);
391 mpfr_add(dev
, dev
, num
, MPFR_DEFAULT_RND
);
392 p
= (statistic_t
*)(p
->next
);
394 mpfr_div_ui(c
->mf
, dev
, pop_type
? n
-1 : n
, MPFR_DEFAULT_RND
);
395 mpfr_sqrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
397 if (calc
.base
!= IDC_RADIO_DEC
)
398 mpfr_trunc(c
->mf
, c
->mf
);
404 void rpn_s(calc_number_t
*c
)
409 void rpn_s_m1(calc_number_t
*c
)
414 void rpn_dms2dec(calc_number_t
*c
)
422 mpfr_trunc(d
, c
->mf
);
423 mpfr_frac(m
, c
->mf
, MPFR_DEFAULT_RND
);
424 mpfr_mul_ui(m
, m
, 100, MPFR_DEFAULT_RND
);
426 mpfr_frac(s
, m
, MPFR_DEFAULT_RND
);
428 mpfr_mul_ui(s
, s
, 100, MPFR_DEFAULT_RND
);
431 mpfr_div_ui(m
, m
, 60, MPFR_DEFAULT_RND
);
432 mpfr_div_ui(s
, s
, 3600, MPFR_DEFAULT_RND
);
433 mpfr_add(c
->mf
, d
, m
, MPFR_DEFAULT_RND
);
434 mpfr_add(c
->mf
, c
->mf
, s
, MPFR_DEFAULT_RND
);
441 void rpn_dec2dms(calc_number_t
*c
)
449 mpfr_trunc(d
, c
->mf
);
450 mpfr_frac(m
, c
->mf
, MPFR_DEFAULT_RND
);
451 mpfr_mul_ui(m
, m
, 60, MPFR_DEFAULT_RND
);
453 mpfr_frac(s
, m
, MPFR_DEFAULT_RND
);
455 mpfr_mul_ui(s
, s
, 60, MPFR_DEFAULT_RND
);
458 mpfr_div_ui(m
, m
, 100, MPFR_DEFAULT_RND
);
459 mpfr_div_ui(s
, s
, 10000, MPFR_DEFAULT_RND
);
460 mpfr_add(c
->mf
, d
, m
, MPFR_DEFAULT_RND
);
461 mpfr_add(c
->mf
, c
->mf
, s
, MPFR_DEFAULT_RND
);
468 void rpn_zero(calc_number_t
*c
)
470 mpfr_set_ui(c
->mf
, 0, MPFR_DEFAULT_RND
);
473 void rpn_copy(calc_number_t
*dst
, calc_number_t
*src
)
475 mpfr_set(dst
->mf
, src
->mf
, MPFR_DEFAULT_RND
);
478 int rpn_is_zero(calc_number_t
*c
)
480 return (mpfr_sgn(c
->mf
) == 0);
483 void rpn_alloc(calc_number_t
*c
)
488 void rpn_free(calc_number_t
*c
)