82bd6f4661761b3668e8de0a226c44064f197c24
3 void apply_int_mask(calc_number_t
*r
)
21 mask
= (unsigned __int64
)-1;
26 double asinh(double x
)
28 return log(x
+sqrt(x
*x
+1));
31 double acosh(double x
)
33 // must be x>=1, if not return Nan (Not a Number)
34 if(!(x
>=1.0)) return sqrt(-1.0);
36 // return only the positive result (as sqrt does).
37 return log(x
+sqrt(x
*x
-1.0));
40 double atanh(double x
)
42 // must be x>-1, x<1, if not return Nan (Not a Number)
43 if(!(x
>-1.0 && x
<1.0)) return sqrt(-1.0);
45 return log((1.0+x
)/(1.0-x
))/2.0;
48 double validate_rad2angle(double a
)
52 a
= a
* (180.0/CALC_PI
);
57 a
= a
* (200.0/CALC_PI
);
63 double validate_angle2rad(calc_number_t
*c
)
67 c
->f
= c
->f
* (CALC_PI
/180.0);
72 c
->f
= c
->f
* (CALC_PI
/200.0);
78 void rpn_sin(calc_number_t
*c
)
80 double angle
= validate_angle2rad(c
);
82 if (angle
== 0 || angle
== CALC_PI
)
85 if (angle
== CALC_3_PI_2
)
88 if (angle
== CALC_2_PI
)
93 void rpn_cos(calc_number_t
*c
)
95 double angle
= validate_angle2rad(c
);
97 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
100 if (angle
== CALC_PI
)
103 if (angle
== CALC_2_PI
)
108 void rpn_tan(calc_number_t
*c
)
110 double angle
= validate_angle2rad(c
);
112 if (angle
== CALC_PI_2
|| angle
== CALC_3_PI_2
)
115 if (angle
== CALC_PI
|| angle
== CALC_2_PI
)
121 void rpn_asin(calc_number_t
*c
)
123 c
->f
= validate_rad2angle(asin(c
->f
));
127 void rpn_acos(calc_number_t
*c
)
129 c
->f
= validate_rad2angle(acos(c
->f
));
133 void rpn_atan(calc_number_t
*c
)
135 c
->f
= validate_rad2angle(atan(c
->f
));
140 void rpn_sinh(calc_number_t
*c
)
146 void rpn_cosh(calc_number_t
*c
)
152 void rpn_tanh(calc_number_t
*c
)
159 void rpn_asinh(calc_number_t
*c
)
165 void rpn_acosh(calc_number_t
*c
)
171 void rpn_atanh(calc_number_t
*c
)
178 void rpn_int(calc_number_t
*c
)
182 modf(calc
.code
.f
, &int_part
);
186 void rpn_frac(calc_number_t
*c
)
190 c
->f
= modf(calc
.code
.f
, &int_part
);
193 void rpn_reci(calc_number_t
*c
)
201 void rpn_fact(calc_number_t
*c
)
203 double fact
, mult
, num
;
205 if (calc
.base
== IDC_RADIO_DEC
)
223 while (mult
<= num
) {
229 if (_finite(fact
) == 0)
232 if (calc
.base
== IDC_RADIO_DEC
)
235 c
->i
= (__int64
)fact
;
238 __int64
logic_dbl2int(calc_number_t
*a
)
243 modf(a
->f
, &int_part
);
244 width
= (int_part
==0) ? 1 : (int)log10(fabs(int_part
))+1;
249 return (__int64
)int_part
;
251 double logic_int2dbl(calc_number_t
*a
)
256 void rpn_not(calc_number_t
*c
)
258 if (calc
.base
== IDC_RADIO_DEC
) {
260 n
.i
= logic_dbl2int(c
);
261 c
->f
= (long double)(~n
.i
);
266 void rpn_pi(calc_number_t
*c
)
271 void rpn_2pi(calc_number_t
*c
)
276 void rpn_sign(calc_number_t
*c
)
278 if (calc
.base
== IDC_RADIO_DEC
)
284 void rpn_exp2(calc_number_t
*c
)
286 if (calc
.base
== IDC_RADIO_DEC
) {
288 if (_finite(c
->f
) == 0)
294 void rpn_exp3(calc_number_t
*c
)
296 if (calc
.base
== IDC_RADIO_DEC
) {
297 c
->f
= pow(c
->f
, 3.);
298 if (_finite(c
->f
) == 0)
304 static __int64
myabs64(__int64 number
)
306 return (number
< 0) ? 0-number
: number
;
309 static unsigned __int64
sqrti(unsigned __int64 number
)
311 /* modified form of Newton's method for approximating roots */
312 #define NEXT(n, i) (((n) + (i)/(n)) >> 1)
313 unsigned __int64 n
, n1
;
316 if (number
== 0xffffffffffffffffLL
)
318 if (number
== 0xffffffffffffffff)
323 n1
= NEXT(n
, number
);
324 while (myabs64(n1
- n
) > 1) {
326 n1
= NEXT(n
, number
);
328 while((n1
*n1
) > number
)
334 void rpn_sqrt(calc_number_t
*c
)
336 if (calc
.base
== IDC_RADIO_DEC
) {
346 static __int64
cbrti(__int64 x
) {
353 b
= (3*y
*(y
+ 1) + 1) << s
;
363 void rpn_cbrt(calc_number_t
*c
)
365 if (calc
.base
== IDC_RADIO_DEC
)
366 #if defined(__GNUC__) && !defined(__REACTOS__)
369 c
->f
= pow(c
->f
,1./3.);
376 void rpn_exp(calc_number_t
*c
)
379 if (_finite(c
->f
) == 0)
383 void rpn_exp10(calc_number_t
*c
)
387 modf(c
->f
, &int_part
);
388 if (fmod(int_part
, 2.) == 0.)
391 c
->f
= pow(10., c
->f
);
392 if (_finite(c
->f
) == 0)
397 void rpn_ln(calc_number_t
*c
)
405 void rpn_log(calc_number_t
*c
)
413 static double stat_sum(void)
416 statistic_t
*p
= calc
.stat
;
419 if (p
->base
== IDC_RADIO_DEC
)
423 p
= (statistic_t
*)(p
->next
);
428 void rpn_ave(calc_number_t
*c
)
434 n
= SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
437 ave
= ave
/ (double)n
;
438 if (calc
.base
== IDC_RADIO_DEC
)
444 void rpn_sum(calc_number_t
*c
)
446 double sum
= stat_sum();
448 if (calc
.base
== IDC_RADIO_DEC
)
454 static void rpn_s_ex(calc_number_t
*c
, int pop_type
)
460 statistic_t
*p
= calc
.stat
;
463 n
= (double)SendDlgItemMessage(calc
.hStatWnd
, IDC_LIST_STAT
, LB_GETCOUNT
, 0, 0);
474 if (p
->base
== IDC_RADIO_DEC
)
477 num
= (double)p
->num
.i
;
478 dev
+= pow(num
-ave
, 2.);
479 p
= (statistic_t
*)(p
->next
);
481 dev
= sqrt(dev
/(pop_type
? n
-1 : n
));
482 if (calc
.base
== IDC_RADIO_DEC
)
488 void rpn_s(calc_number_t
*c
)
493 void rpn_s_m1(calc_number_t
*c
)
498 void rpn_dms2dec(calc_number_t
*c
)
502 m
= modf(c
->f
, &d
) * 100;
503 s
= (modf(m
, &m
) * 100)+.5;
512 void rpn_dec2dms(calc_number_t
*c
)
516 m
= modf(c
->f
, &d
) * 60;
517 s
= ceil(modf(m
, &m
) * 60);
518 c
->f
= d
+ m
/100. + s
/10000.;
521 void rpn_zero(calc_number_t
*c
)
526 void rpn_copy(calc_number_t
*dst
, calc_number_t
*src
)
531 int rpn_is_zero(calc_number_t
*c
)
536 void rpn_alloc(calc_number_t
*c
)
540 void rpn_free(calc_number_t
*c
)