4 void apply_int_mask(calc_number_t
*r
)
22 mask
= (unsigned __int64
)-1;
27 double asinh(double x
)
29 return log(x
+sqrt(x
*x
+1));
32 double acosh(double x
)
34 // must be x>=1, if not return Nan (Not a Number)
35 if(!(x
>=1.0)) return sqrt(-1.0);
37 // return only the positive result (as sqrt does).
38 return log(x
+sqrt(x
*x
-1.0));
41 double atanh(double x
)
43 // must be x>-1, x<1, if not return Nan (Not a Number)
44 if(!(x
>-1.0 && x
<1.0)) return sqrt(-1.0);
46 return log((1.0+x
)/(1.0-x
))/2.0;
49 double validate_rad2angle(double a
)
53 a
= a
* (180.0/CALC_PI
);
58 a
= a
* (200.0/CALC_PI
);
64 double validate_angle2rad(calc_number_t
*c
)
68 c
->f
= c
->f
* (CALC_PI
/180.0);
73 c
->f
= c
->f
* (CALC_PI
/200.0);
79 void rpn_sin(calc_number_t
*c
)
81 double angle
= validate_angle2rad(c
);
83 if (angle
== 0 || angle
== CALC_PI
)
86 if (angle
== CALC_3_PI_2
)
89 if (angle
== CALC_2_PI
)
94 void rpn_cos(calc_number_t
*c
)
96 double angle
= validate_angle2rad(c
);
98 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
101 if (angle
== CALC_PI
)
104 if (angle
== CALC_2_PI
)
109 void rpn_tan(calc_number_t
*c
)
111 double angle
= validate_angle2rad(c
);
113 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
116 if (angle
== CALC_PI
|| angle
== CALC_2_PI
)
122 void rpn_asin(calc_number_t
*c
)
124 c
->f
= validate_rad2angle(asin(c
->f
));
128 void rpn_acos(calc_number_t
*c
)
130 c
->f
= validate_rad2angle(acos(c
->f
));
134 void rpn_atan(calc_number_t
*c
)
136 c
->f
= validate_rad2angle(atan(c
->f
));
141 void rpn_sinh(calc_number_t
*c
)
147 void rpn_cosh(calc_number_t
*c
)
153 void rpn_tanh(calc_number_t
*c
)
160 void rpn_asinh(calc_number_t
*c
)
166 void rpn_acosh(calc_number_t
*c
)
172 void rpn_atanh(calc_number_t
*c
)
179 void rpn_int(calc_number_t
*c
)
183 modf(calc
.code
.f
, &int_part
);
187 void rpn_frac(calc_number_t
*c
)
191 c
->f
= modf(calc
.code
.f
, &int_part
);
194 void rpn_reci(calc_number_t
*c
)
202 void rpn_fact(calc_number_t
*c
)
204 double fact
, mult
, num
;
206 if (calc
.base
== IDC_RADIO_DEC
)
224 while (mult
<= num
) {
230 if (_finite(fact
) == 0)
233 if (calc
.base
== IDC_RADIO_DEC
)
236 c
->i
= (__int64
)fact
;
239 __int64
logic_dbl2int(calc_number_t
*a
)
244 modf(a
->f
, &int_part
);
245 width
= (int_part
==0) ? 1 : (int)log10(fabs(int_part
))+1;
250 return (__int64
)int_part
;
252 double logic_int2dbl(calc_number_t
*a
)
257 void rpn_not(calc_number_t
*c
)
259 if (calc
.base
== IDC_RADIO_DEC
) {
261 n
.i
= logic_dbl2int(c
);
262 c
->f
= (long double)(~n
.i
);
267 void rpn_pi(calc_number_t
*c
)
272 void rpn_2pi(calc_number_t
*c
)
277 void rpn_sign(calc_number_t
*c
)
279 if (calc
.base
== IDC_RADIO_DEC
)
285 void rpn_exp2(calc_number_t
*c
)
287 if (calc
.base
== IDC_RADIO_DEC
) {
289 if (_finite(c
->f
) == 0)
295 void rpn_exp3(calc_number_t
*c
)
297 if (calc
.base
== IDC_RADIO_DEC
) {
298 c
->f
= pow(c
->f
, 3.);
299 if (_finite(c
->f
) == 0)
305 static __int64
myabs64(__int64 number
)
307 return (number
< 0) ? 0-number
: number
;
310 static unsigned __int64
sqrti(unsigned __int64 number
)
312 /* modified form of Newton's method for approximating roots */
313 #define NEXT(n, i) (((n) + (i)/(n)) >> 1)
314 unsigned __int64 n
, n1
;
317 if (number
== 0xffffffffffffffffLL
)
319 if (number
== 0xffffffffffffffff)
324 n1
= NEXT(n
, number
);
325 while (myabs64(n1
- n
) > 1) {
327 n1
= NEXT(n
, number
);
329 while((n1
*n1
) > number
)
335 void rpn_sqrt(calc_number_t
*c
)
337 if (calc
.base
== IDC_RADIO_DEC
) {
347 static __int64
cbrti(__int64 x
) {
354 b
= (3*y
*(y
+ 1) + 1) << s
;
364 void rpn_cbrt(calc_number_t
*c
)
366 if (calc
.base
== IDC_RADIO_DEC
)
367 #if defined(__GNUC__) && !defined(__REACTOS__)
370 c
->f
= pow(c
->f
,1./3.);
377 void rpn_exp(calc_number_t
*c
)
380 if (_finite(c
->f
) == 0)
384 void rpn_exp10(calc_number_t
*c
)
388 modf(c
->f
, &int_part
);
389 if (fmod(int_part
, 2.) == 0.)
392 c
->f
= pow(10., c
->f
);
393 if (_finite(c
->f
) == 0)
398 void rpn_ln(calc_number_t
*c
)
406 void rpn_log(calc_number_t
*c
)
414 static double stat_sum(void)
417 statistic_t
*p
= calc
.stat
;
420 if (p
->base
== IDC_RADIO_DEC
)
424 p
= (statistic_t
*)(p
->next
);
429 void rpn_ave(calc_number_t
*c
)
435 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
438 ave
= ave
/ (double)n
;
439 if (calc
.base
== IDC_RADIO_DEC
)
445 void rpn_sum(calc_number_t
*c
)
447 double sum
= stat_sum();
449 if (calc
.base
== IDC_RADIO_DEC
)
455 static void rpn_s_ex(calc_number_t
*c
, int pop_type
)
461 statistic_t
*p
= calc
.stat
;
464 n
= (double)SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
475 if (p
->base
== IDC_RADIO_DEC
)
478 num
= (double)p
->num
.i
;
479 dev
+= pow(num
-ave
, 2.);
480 p
= (statistic_t
*)(p
->next
);
482 dev
= sqrt(dev
/(pop_type
? n
-1 : n
));
483 if (calc
.base
== IDC_RADIO_DEC
)
489 void rpn_s(calc_number_t
*c
)
494 void rpn_s_m1(calc_number_t
*c
)
499 void rpn_dms2dec(calc_number_t
*c
)
503 m
= modf(c
->f
, &d
) * 100;
504 s
= (modf(m
, &m
) * 100)+.5;
513 void rpn_dec2dms(calc_number_t
*c
)
517 m
= modf(c
->f
, &d
) * 60;
518 s
= ceil(modf(m
, &m
) * 60);
519 c
->f
= d
+ m
/100. + s
/10000.;
522 void rpn_zero(calc_number_t
*c
)
527 void rpn_copy(calc_number_t
*dst
, calc_number_t
*src
)
532 int rpn_is_zero(calc_number_t
*c
)
537 void rpn_alloc(calc_number_t
*c
)
541 void rpn_free(calc_number_t
*c
)