3 void apply_int_mask(calc_number_t
*r
)
9 mpz_init_set_str(mask
, "FFFFFFFFFFFFFFFF", 16);
12 mpz_init_set_str(mask
, "00000000FFFFFFFF", 16);
15 mpz_init_set_str(mask
, "000000000000FFFF", 16);
18 mpz_init_set_str(mask
, "00000000000000FF", 16);
21 mpz_init_set_si(mask
, -1);
24 mpfr_get_z(a
, r
->mf
, MPFR_DEFAULT_RND
);
26 mpfr_set_z(r
->mf
, a
, MPFR_DEFAULT_RND
);
31 void validate_rad2angle(calc_number_t
*r
)
39 mpfr_set_ui(mult
, 180, MPFR_DEFAULT_RND
);
40 mpfr_const_pi(divs
, MPFR_DEFAULT_RND
);
43 mpfr_set_ui(mult
, 1, MPFR_DEFAULT_RND
);
44 mpfr_set_ui(divs
, 1, MPFR_DEFAULT_RND
);
47 mpfr_set_ui(mult
, 200, MPFR_DEFAULT_RND
);
48 mpfr_const_pi(divs
, MPFR_DEFAULT_RND
);
51 mpfr_mul(r
->mf
, r
->mf
, mult
, MPFR_DEFAULT_RND
);
52 mpfr_div(r
->mf
, r
->mf
, divs
, MPFR_DEFAULT_RND
);
58 void validate_angle2rad(calc_number_t
*r
)
62 if (!mpfr_number_p(r
->mf
)) {
70 mpfr_const_pi(mult
, MPFR_DEFAULT_RND
);
71 mpfr_set_ui(divs
, 180, MPFR_DEFAULT_RND
);
74 mpfr_set_ui(mult
, 1, MPFR_DEFAULT_RND
);
75 mpfr_set_ui(divs
, 1, MPFR_DEFAULT_RND
);
78 mpfr_const_pi(mult
, MPFR_DEFAULT_RND
);
79 mpfr_set_ui(divs
, 200, MPFR_DEFAULT_RND
);
82 mpfr_mul(r
->mf
, r
->mf
, mult
, MPFR_DEFAULT_RND
);
83 mpfr_div(r
->mf
, r
->mf
, divs
, MPFR_DEFAULT_RND
);
89 static void build_rad_const(
97 mpfr_init(*mp_3_pi_2
);
99 mpfr_const_pi(*mp_pi
, MPFR_DEFAULT_RND
);
100 mpfr_div_ui(*mp_pi_2
, *mp_pi
, 2, MPFR_DEFAULT_RND
);
101 mpfr_mul_ui(*mp_3_pi_2
, *mp_pi
, 3, MPFR_DEFAULT_RND
);
102 mpfr_div_ui(*mp_3_pi_2
, *mp_3_pi_2
, 2, MPFR_DEFAULT_RND
);
103 mpfr_mul_ui(*mp_2_pi
, *mp_pi
, 2, MPFR_DEFAULT_RND
);
106 void rpn_sin(calc_number_t
*c
)
108 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
110 validate_angle2rad(c
);
111 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
113 if (rpn_is_zero(c
) || !mpfr_cmp(c
->mf
, mp_pi
) || !mpfr_cmp(c
->mf
, mp_2_pi
))
116 if (!mpfr_cmp(c
->mf
, mp_3_pi_2
))
117 mpfr_set_si(c
->mf
, -1, MPFR_DEFAULT_RND
);
119 if (!mpfr_cmp(c
->mf
, mp_pi_2
))
120 mpfr_set_si(c
->mf
, 1, MPFR_DEFAULT_RND
);
122 mpfr_sin(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
123 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
127 mpfr_clear(mp_3_pi_2
);
130 void rpn_cos(calc_number_t
*c
)
132 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
134 validate_angle2rad(c
);
135 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
137 if (!mpfr_cmp(c
->mf
, mp_pi_2
) || !mpfr_cmp(c
->mf
, mp_3_pi_2
))
140 if (!mpfr_cmp(c
->mf
, mp_pi
))
141 mpfr_set_si(c
->mf
, -1, MPFR_DEFAULT_RND
);
143 if (!mpfr_cmp(c
->mf
, mp_2_pi
))
144 mpfr_set_si(c
->mf
, 1, MPFR_DEFAULT_RND
);
146 mpfr_cos(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
147 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
151 mpfr_clear(mp_3_pi_2
);
154 void rpn_tan(calc_number_t
*c
)
156 mpfr_t mp_pi
, mp_pi_2
, mp_3_pi_2
, mp_2_pi
;
158 validate_angle2rad(c
);
159 build_rad_const(&mp_pi
, &mp_pi_2
, &mp_3_pi_2
, &mp_2_pi
);
161 if (!mpfr_cmp(c
->mf
, mp_pi_2
) || !mpfr_cmp(c
->mf
, mp_3_pi_2
))
164 if (!mpfr_cmp(c
->mf
, mp_pi
) || !mpfr_cmp(c
->mf
, mp_2_pi
))
167 mpfr_tan(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
168 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
172 mpfr_clear(mp_3_pi_2
);
176 void rpn_asin(calc_number_t
*c
)
178 mpfr_asin(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
179 validate_rad2angle(c
);
181 void rpn_acos(calc_number_t
*c
)
183 mpfr_acos(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
184 validate_rad2angle(c
);
186 void rpn_atan(calc_number_t
*c
)
188 mpfr_atan(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
189 validate_rad2angle(c
);
192 void rpn_sinh(calc_number_t
*c
)
194 mpfr_sinh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
195 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
197 void rpn_cosh(calc_number_t
*c
)
199 mpfr_cosh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
200 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
202 void rpn_tanh(calc_number_t
*c
)
204 mpfr_tanh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
205 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
208 void rpn_asinh(calc_number_t
*c
)
210 mpfr_asinh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
211 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
213 void rpn_acosh(calc_number_t
*c
)
215 mpfr_acosh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
216 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
218 void rpn_atanh(calc_number_t
*c
)
220 mpfr_atanh(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
221 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
224 void rpn_int(calc_number_t
*c
)
226 mpfr_trunc(c
->mf
, c
->mf
);
229 void rpn_frac(calc_number_t
*c
)
231 mpfr_frac(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
234 void rpn_reci(calc_number_t
*c
)
236 if (mpfr_sgn(c
->mf
) == 0)
239 mpfr_ui_div(c
->mf
, 1, c
->mf
, MPFR_DEFAULT_RND
);
242 void rpn_fact(calc_number_t
*c
)
244 if (mpfr_sgn(c
->mf
) < 0) {
249 mpfr_trunc(c
->mf
, c
->mf
);
250 if (mpfr_fits_ulong_p(c
->mf
, MPFR_DEFAULT_RND
) == 0)
253 mpfr_fac_ui(c
->mf
, mpfr_get_ui(c
->mf
, MPFR_DEFAULT_RND
), MPFR_DEFAULT_RND
);
254 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
258 void rpn_not(calc_number_t
*c
)
263 mpfr_get_z(a
, c
->mf
, MPFR_DEFAULT_RND
);
265 mpfr_set_z(c
->mf
, a
, MPFR_DEFAULT_RND
);
269 void rpn_pi(calc_number_t
*c
)
271 mpfr_const_pi(c
->mf
, MPFR_DEFAULT_RND
);
274 void rpn_2pi(calc_number_t
*c
)
276 mpfr_const_pi(c
->mf
, MPFR_DEFAULT_RND
);
277 mpfr_mul_ui(c
->mf
, c
->mf
, 2, MPFR_DEFAULT_RND
);
280 void rpn_sign(calc_number_t
*c
)
282 mpfr_mul_si(c
->mf
, c
->mf
, -1, MPFR_DEFAULT_RND
);
285 void rpn_exp2(calc_number_t
*c
)
287 mpfr_sqr(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
288 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
291 void rpn_exp3(calc_number_t
*c
)
293 mpfr_pow_ui(c
->mf
, c
->mf
, 3, MPFR_DEFAULT_RND
);
294 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
297 void rpn_sqrt(calc_number_t
*c
)
299 mpfr_sqrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
300 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
303 void rpn_cbrt(calc_number_t
*c
)
305 mpfr_cbrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
306 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
309 void rpn_exp(calc_number_t
*c
)
311 mpfr_exp(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
312 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
315 void rpn_exp10(calc_number_t
*c
)
317 mpfr_exp10(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
318 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
321 void rpn_ln(calc_number_t
*c
)
323 mpfr_log(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
324 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
327 void rpn_log(calc_number_t
*c
)
329 mpfr_log10(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
330 if (!mpfr_number_p(c
->mf
)) calc
.is_nan
= TRUE
;
333 static void stat_sum(mpfr_t sum
)
335 statistic_t
*p
= calc
.stat
;
337 mpfr_set_ui(sum
, 0, MPFR_DEFAULT_RND
);
339 mpfr_add(sum
, sum
, p
->num
.mf
, MPFR_DEFAULT_RND
);
340 p
= (statistic_t
*)(p
->next
);
344 void rpn_ave(calc_number_t
*c
)
349 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
352 mpfr_div_ui(c
->mf
, c
->mf
, n
, MPFR_DEFAULT_RND
);
354 if (calc
.base
!= IDC_RADIO_DEC
)
355 mpfr_trunc(c
->mf
, c
->mf
);
358 void rpn_sum(calc_number_t
*c
)
362 if (calc
.base
!= IDC_RADIO_DEC
)
363 mpfr_trunc(c
->mf
, c
->mf
);
366 static void rpn_s_ex(calc_number_t
*c
, int pop_type
)
371 statistic_t
*p
= calc
.stat
;
373 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
375 mpfr_set_ui(c
->mf
, 0, MPFR_DEFAULT_RND
);
380 mpfr_div_ui(c
->mf
, c
->mf
, n
, MPFR_DEFAULT_RND
);
385 mpfr_set_ui(dev
, 0, MPFR_DEFAULT_RND
);
388 mpfr_sub(num
, p
->num
.mf
, c
->mf
, MPFR_DEFAULT_RND
);
389 mpfr_sqr(num
, num
, MPFR_DEFAULT_RND
);
390 mpfr_add(dev
, dev
, num
, MPFR_DEFAULT_RND
);
391 p
= (statistic_t
*)(p
->next
);
393 mpfr_div_ui(c
->mf
, dev
, pop_type
? n
-1 : n
, MPFR_DEFAULT_RND
);
394 mpfr_sqrt(c
->mf
, c
->mf
, MPFR_DEFAULT_RND
);
396 if (calc
.base
!= IDC_RADIO_DEC
)
397 mpfr_trunc(c
->mf
, c
->mf
);
403 void rpn_s(calc_number_t
*c
)
408 void rpn_s_m1(calc_number_t
*c
)
413 void rpn_dms2dec(calc_number_t
*c
)
421 mpfr_trunc(d
, c
->mf
);
422 mpfr_frac(m
, c
->mf
, MPFR_DEFAULT_RND
);
423 mpfr_mul_ui(m
, m
, 100, MPFR_DEFAULT_RND
);
425 mpfr_frac(s
, m
, MPFR_DEFAULT_RND
);
427 mpfr_mul_ui(s
, s
, 100, MPFR_DEFAULT_RND
);
430 mpfr_div_ui(m
, m
, 60, MPFR_DEFAULT_RND
);
431 mpfr_div_ui(s
, s
, 3600, MPFR_DEFAULT_RND
);
432 mpfr_add(c
->mf
, d
, m
, MPFR_DEFAULT_RND
);
433 mpfr_add(c
->mf
, c
->mf
, s
, MPFR_DEFAULT_RND
);
440 void rpn_dec2dms(calc_number_t
*c
)
448 mpfr_trunc(d
, c
->mf
);
449 mpfr_frac(m
, c
->mf
, MPFR_DEFAULT_RND
);
450 mpfr_mul_ui(m
, m
, 60, MPFR_DEFAULT_RND
);
452 mpfr_frac(s
, m
, MPFR_DEFAULT_RND
);
454 mpfr_mul_ui(s
, s
, 60, MPFR_DEFAULT_RND
);
457 mpfr_div_ui(m
, m
, 100, MPFR_DEFAULT_RND
);
458 mpfr_div_ui(s
, s
, 10000, MPFR_DEFAULT_RND
);
459 mpfr_add(c
->mf
, d
, m
, MPFR_DEFAULT_RND
);
460 mpfr_add(c
->mf
, c
->mf
, s
, MPFR_DEFAULT_RND
);
467 void rpn_zero(calc_number_t
*c
)
469 mpfr_set_ui(c
->mf
, 0, MPFR_DEFAULT_RND
);
472 void rpn_copy(calc_number_t
*dst
, calc_number_t
*src
)
474 mpfr_set(dst
->mf
, src
->mf
, MPFR_DEFAULT_RND
);
477 int rpn_is_zero(calc_number_t
*c
)
479 return (mpfr_sgn(c
->mf
) == 0);
482 void rpn_alloc(calc_number_t
*c
)
487 void rpn_free(calc_number_t
*c
)