5 void apply_int_mask(calc_number_t
*r
)
23 mask
= (unsigned __int64
)-1;
28 double asinh(double x
)
30 return log(x
+sqrt(x
*x
+1));
33 double acosh(double x
)
35 // must be x>=1, if not return Nan (Not a Number)
36 if(!(x
>=1.0)) return sqrt(-1.0);
38 // return only the positive result (as sqrt does).
39 return log(x
+sqrt(x
*x
-1.0));
42 double atanh(double x
)
44 // must be x>-1, x<1, if not return Nan (Not a Number)
45 if(!(x
>-1.0 && x
<1.0)) return sqrt(-1.0);
47 return log((1.0+x
)/(1.0-x
))/2.0;
50 double validate_rad2angle(double a
)
54 a
= a
* (180.0/CALC_PI
);
59 a
= a
* (200.0/CALC_PI
);
65 double validate_angle2rad(calc_number_t
*c
)
69 c
->f
= c
->f
* (CALC_PI
/180.0);
74 c
->f
= c
->f
* (CALC_PI
/200.0);
80 void rpn_sin(calc_number_t
*c
)
82 double angle
= validate_angle2rad(c
);
84 if (angle
== 0 || angle
== CALC_PI
)
87 if (angle
== CALC_3_PI_2
)
90 if (angle
== CALC_2_PI
)
95 void rpn_cos(calc_number_t
*c
)
97 double angle
= validate_angle2rad(c
);
99 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
102 if (angle
== CALC_PI
)
105 if (angle
== CALC_2_PI
)
110 void rpn_tan(calc_number_t
*c
)
112 double angle
= validate_angle2rad(c
);
114 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
117 if (angle
== CALC_PI
|| angle
== CALC_2_PI
)
123 void rpn_asin(calc_number_t
*c
)
125 c
->f
= validate_rad2angle(asin(c
->f
));
129 void rpn_acos(calc_number_t
*c
)
131 c
->f
= validate_rad2angle(acos(c
->f
));
135 void rpn_atan(calc_number_t
*c
)
137 c
->f
= validate_rad2angle(atan(c
->f
));
142 void rpn_sinh(calc_number_t
*c
)
148 void rpn_cosh(calc_number_t
*c
)
154 void rpn_tanh(calc_number_t
*c
)
161 void rpn_asinh(calc_number_t
*c
)
167 void rpn_acosh(calc_number_t
*c
)
173 void rpn_atanh(calc_number_t
*c
)
180 void rpn_int(calc_number_t
*c
)
184 modf(calc
.code
.f
, &int_part
);
188 void rpn_frac(calc_number_t
*c
)
192 c
->f
= modf(calc
.code
.f
, &int_part
);
195 void rpn_reci(calc_number_t
*c
)
203 void rpn_fact(calc_number_t
*c
)
205 double fact
, mult
, num
;
207 if (calc
.base
== IDC_RADIO_DEC
)
225 while (mult
<= num
) {
231 if (_finite(fact
) == 0)
234 if (calc
.base
== IDC_RADIO_DEC
)
237 c
->i
= (__int64
)fact
;
240 __int64
logic_dbl2int(calc_number_t
*a
)
245 modf(a
->f
, &int_part
);
246 width
= (int_part
==0) ? 1 : (int)log10(fabs(int_part
))+1;
251 return (__int64
)int_part
;
253 double logic_int2dbl(calc_number_t
*a
)
258 void rpn_not(calc_number_t
*c
)
260 if (calc
.base
== IDC_RADIO_DEC
) {
262 n
.i
= logic_dbl2int(c
);
263 c
->f
= (long double)(~n
.i
);
268 void rpn_pi(calc_number_t
*c
)
273 void rpn_2pi(calc_number_t
*c
)
278 void rpn_sign(calc_number_t
*c
)
280 if (calc
.base
== IDC_RADIO_DEC
)
286 void rpn_exp2(calc_number_t
*c
)
288 if (calc
.base
== IDC_RADIO_DEC
) {
290 if (_finite(c
->f
) == 0)
296 void rpn_exp3(calc_number_t
*c
)
298 if (calc
.base
== IDC_RADIO_DEC
) {
299 c
->f
= pow(c
->f
, 3.);
300 if (_finite(c
->f
) == 0)
306 static __int64
myabs64(__int64 number
)
308 return (number
< 0) ? 0-number
: number
;
311 static unsigned __int64
sqrti(unsigned __int64 number
)
313 /* modified form of Newton's method for approximating roots */
314 #define NEXT(n, i) (((n) + (i)/(n)) >> 1)
315 unsigned __int64 n
, n1
;
318 if (number
== 0xffffffffffffffffLL
)
320 if (number
== 0xffffffffffffffff)
325 n1
= NEXT(n
, number
);
326 while (myabs64(n1
- n
) > 1) {
328 n1
= NEXT(n
, number
);
330 while((n1
*n1
) > number
)
336 void rpn_sqrt(calc_number_t
*c
)
338 if (calc
.base
== IDC_RADIO_DEC
) {
348 static __int64
cbrti(__int64 x
) {
355 b
= (3*y
*(y
+ 1) + 1) << s
;
365 void rpn_cbrt(calc_number_t
*c
)
367 if (calc
.base
== IDC_RADIO_DEC
)
368 #if defined(__GNUC__) && !defined(__REACTOS__)
371 c
->f
= pow(c
->f
,1./3.);
378 void rpn_exp(calc_number_t
*c
)
381 if (_finite(c
->f
) == 0)
385 void rpn_exp10(calc_number_t
*c
)
389 modf(c
->f
, &int_part
);
390 if (fmod(int_part
, 2.) == 0.)
393 c
->f
= pow(10., c
->f
);
394 if (_finite(c
->f
) == 0)
399 void rpn_ln(calc_number_t
*c
)
407 void rpn_log(calc_number_t
*c
)
415 static double stat_sum(void)
418 statistic_t
*p
= calc
.stat
;
421 if (p
->base
== IDC_RADIO_DEC
)
425 p
= (statistic_t
*)(p
->next
);
430 void rpn_ave(calc_number_t
*c
)
436 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
439 ave
= ave
/ (double)n
;
440 if (calc
.base
== IDC_RADIO_DEC
)
446 void rpn_sum(calc_number_t
*c
)
448 double sum
= stat_sum();
450 if (calc
.base
== IDC_RADIO_DEC
)
456 static void rpn_s_ex(calc_number_t
*c
, int pop_type
)
462 statistic_t
*p
= calc
.stat
;
465 n
= (double)SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
476 if (p
->base
== IDC_RADIO_DEC
)
479 num
= (double)p
->num
.i
;
480 dev
+= pow(num
-ave
, 2.);
481 p
= (statistic_t
*)(p
->next
);
483 dev
= sqrt(dev
/(pop_type
? n
-1 : n
));
484 if (calc
.base
== IDC_RADIO_DEC
)
490 void rpn_s(calc_number_t
*c
)
495 void rpn_s_m1(calc_number_t
*c
)
500 void rpn_dms2dec(calc_number_t
*c
)
504 m
= modf(c
->f
, &d
) * 100;
505 s
= (modf(m
, &m
) * 100)+.5;
514 void rpn_dec2dms(calc_number_t
*c
)
518 m
= modf(c
->f
, &d
) * 60;
519 s
= ceil(modf(m
, &m
) * 60);
520 c
->f
= d
+ m
/100. + s
/10000.;
523 void rpn_zero(calc_number_t
*c
)
528 void rpn_copy(calc_number_t
*dst
, calc_number_t
*src
)
533 int rpn_is_zero(calc_number_t
*c
)
538 void rpn_alloc(calc_number_t
*c
)
542 void rpn_free(calc_number_t
*c
)