bigdecimal-math_r 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +63 -10
  3. data/changelog.md +32 -0
  4. data/ext/bigdecimal/math_r/algofunc.h +11 -1
  5. data/ext/bigdecimal/math_r/api/bigmath/const_e.h +1 -1
  6. data/ext/bigdecimal/math_r/api/bigmath/const_euler_gamma.h +5 -0
  7. data/ext/bigdecimal/math_r/api/bigmath/csqrt.h +1 -1
  8. data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal_flo.h +8 -2
  9. data/ext/bigdecimal/math_r/api/numeric/domain_p.h +7 -0
  10. data/ext/bigdecimal/math_r/api/numeric/nan_p.h +4 -1
  11. data/ext/bigdecimal/math_r/api.h +2 -0
  12. data/ext/bigdecimal/math_r/const.c +42 -5
  13. data/ext/bigdecimal/math_r/decl.h +11 -1
  14. data/ext/bigdecimal/math_r/exp.c +45 -3
  15. data/ext/bigdecimal/math_r/extconf.rb +5 -1
  16. data/ext/bigdecimal/math_r/{gamma_r.c → gamma_beta.c} +11 -78
  17. data/ext/bigdecimal/math_r/internal/algo/bigmath/E/{ser.h → napier.h} +1 -1
  18. data/ext/bigdecimal/math_r/internal/algo/bigmath/EulerGamma/borwein_bailey.h +37 -0
  19. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG10/ser.h +4 -2
  20. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG_PI/builtin.h +3 -1
  21. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT2/builtin.h +4 -1
  22. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT3/builtin.h +4 -1
  23. data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/branch.h +11 -4
  24. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/branch.h +2 -2
  25. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/edom.h +7 -5
  26. data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/logrep.h +9 -6
  27. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/branch.h +4 -4
  28. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/edom.h +4 -3
  29. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/logrep.h +5 -2
  30. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/branch.h +3 -4
  31. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/edom.h +7 -6
  32. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/logrep.h +6 -5
  33. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/branch.h +3 -9
  34. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/logrep.h +7 -6
  35. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/branch.h +7 -4
  36. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/edom.h +7 -6
  37. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/logrep.h +8 -7
  38. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/branch.h +2 -5
  39. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/edom.h +10 -6
  40. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/logrep.h +3 -2
  41. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/branch.h +4 -2
  42. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/edom.h +6 -5
  43. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/logrep.h +3 -2
  44. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/ser.h +1 -0
  45. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/logrep.h +6 -5
  46. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/ser.h +1 -0
  47. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/branch.h +1 -1
  48. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/logrep.h +7 -6
  49. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_euler.h +4 -50
  50. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_usual.h +2 -9
  51. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/branch.h +4 -3
  52. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/edom.h +6 -3
  53. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/logrep.h +2 -0
  54. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/ser.h +1 -0
  55. data/ext/bigdecimal/math_r/internal/algo/bigmath/cabs/formula.h +6 -2
  56. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/logrep.h +7 -4
  57. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/logrep.h +6 -5
  58. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/logrep.h +3 -2
  59. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/logrep.h +8 -4
  60. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/logrep.h +5 -4
  61. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/logrep.h +7 -3
  62. data/ext/bigdecimal/math_r/internal/algo/bigmath/carg/formula.h +6 -2
  63. data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/logrep.h +5 -4
  64. data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/logrep.h +3 -1
  65. data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/logrep.h +6 -4
  66. data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/logrep.h +1 -0
  67. data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/logrep.h +3 -2
  68. data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/logrep.h +5 -2
  69. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/branch.h +40 -0
  70. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/formula.h +5 -2
  71. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/eulerf.h +4 -3
  72. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/eulerf.h +4 -3
  73. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/eulerf.h +5 -3
  74. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/eulerf.h +4 -2
  75. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/eulerf.h +4 -2
  76. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/eulerf.h +5 -3
  77. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/eulerf.h +10 -7
  78. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/eulerf.h +5 -3
  79. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexpm1/branch.h +13 -0
  80. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexpm1/identity.h +17 -0
  81. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/branch.h +11 -12
  82. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/branch.h +53 -0
  83. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/formula.h +4 -3
  84. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/branch.h +53 -0
  85. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/formula.h +4 -3
  86. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/eulerf.h +6 -4
  87. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/ser.h +4 -4
  88. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/eulerf.h +5 -3
  89. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/formula.h +5 -5
  90. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/ser.h +4 -3
  91. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/eulerf.h +5 -3
  92. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/ser.h +3 -2
  93. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/eulerf.h +4 -2
  94. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/formula.h +1 -0
  95. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/ser.h +3 -2
  96. data/ext/bigdecimal/math_r/internal/algo/bigmath/cpow/formula.h +9 -7
  97. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/eulerf.h +4 -2
  98. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/ser.h +5 -3
  99. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/eulerf.h +5 -3
  100. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/formula.h +2 -2
  101. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/ser.h +6 -3
  102. data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/eulerf.h +5 -3
  103. data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/eulerf.h +5 -3
  104. data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/eulerf.h +4 -3
  105. data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/eulerf.h +4 -3
  106. data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/branch.h +40 -0
  107. data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/formula.h +13 -43
  108. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/eulerf.h +4 -3
  109. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/eulerf.h +4 -3
  110. data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/branch.h +18 -0
  111. data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/newton.h +4 -12
  112. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/algo911.h +7 -4
  113. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/cf.h +1 -0
  114. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_inf.h +1 -0
  115. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_zero.h +1 -0
  116. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/algo911.h +5 -2
  117. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/cf.h +1 -0
  118. data/ext/bigdecimal/math_r/internal/algo/bigmath/escalb/edf.h +2 -0
  119. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/builtin.h +7 -1
  120. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/edf.h +6 -5
  121. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/edf.h +9 -5
  122. data/ext/bigdecimal/math_r/internal/algo/bigmath/expm1/branch.h +13 -0
  123. data/ext/bigdecimal/math_r/internal/algo/bigmath/expm1/identity.h +18 -0
  124. data/ext/bigdecimal/math_r/internal/algo/bigmath/expxt/edf.h +1 -1
  125. data/ext/bigdecimal/math_r/internal/algo/bigmath/f_euler/formula.h +3 -2
  126. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/l2norm.h +5 -4
  127. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/mmm.h +1 -1
  128. data/ext/bigdecimal/math_r/internal/algo/bigmath/ipow/edf.h +6 -4
  129. data/ext/bigdecimal/math_r/internal/algo/bigmath/l2norm/formula.h +6 -1
  130. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/branch.h +6 -2
  131. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/builtin.h +3 -2
  132. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edf.h +8 -5
  133. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edom.h +10 -4
  134. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/mercator.h +7 -9
  135. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/ser_okumura.h +4 -1
  136. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/edf.h +3 -2
  137. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/mercator.h +9 -9
  138. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/branch.h +8 -5
  139. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/ser_mercator.h +16 -6
  140. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/branch.h +1 -1
  141. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/edf.h +3 -2
  142. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/mercator.h +9 -9
  143. data/ext/bigdecimal/math_r/internal/algo/bigmath/logxt/edf.h +6 -1
  144. data/ext/bigdecimal/math_r/internal/algo/bigmath/pow/formula.h +13 -8
  145. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm10/edf.h +10 -4
  146. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm2/edf.h +11 -3
  147. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/eulerf.h +5 -3
  148. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/ser.h +6 -4
  149. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/eulerf.h +5 -3
  150. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/formula.h +8 -4
  151. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/ser.h +5 -3
  152. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/eulerf.h +5 -2
  153. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/ser.h +4 -5
  154. data/ext/bigdecimal/math_r/internal/algo/bigmath/sincos/ser.h +9 -2
  155. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/eulerf.h +5 -3
  156. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/formula.h +8 -4
  157. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/ser.h +4 -3
  158. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinhcosh/ser.h +10 -3
  159. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/branch.h +2 -1
  160. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/builtin.h +2 -2
  161. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/edom.h +1 -0
  162. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/eulerf.h +5 -3
  163. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/ser.h +3 -8
  164. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/eulerf.h +5 -3
  165. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/formula.h +7 -3
  166. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/ser.h +3 -3
  167. data/ext/bigdecimal/math_r/internal/algo/bigmath/trig/f_euler.h +11 -5
  168. data/ext/bigdecimal/math_r/log.c +5 -5
  169. data/ext/bigdecimal/math_r/math_r/bigdecimal.h +5 -1
  170. data/ext/bigdecimal/math_r/math_r/bigmath.h +2 -0
  171. data/ext/bigdecimal/math_r/math_r/globals.h +1 -1
  172. data/ext/bigdecimal/math_r/math_r/numeric.h +1 -0
  173. data/ext/bigdecimal/math_r/math_r.c +14 -3
  174. data/ext/bigdecimal/math_r/solver.c +75 -21
  175. data/lib/bigdecimal/math_r/const/E_euler.rb +46 -0
  176. data/lib/bigdecimal/math_r/version.rb +1 -1
  177. data/lib/bigdecimal/math_r.rb +1 -0
  178. metadata +21 -11
  179. data/.ruby-version +0 -1
  180. data/LICENSE.txt +0 -21
  181. data/lib/bigdecimal/math_r.so +0 -0
@@ -16,51 +16,21 @@ csqrt_term(VALUE abs, VALUE a, VALUE prec, ID ops)
16
16
  VALUE
17
17
  csqrt_formula(VALUE z, VALUE prec)
18
18
  {
19
- VALUE w = Qundef;
19
+ const ID add = rb_intern("add"), sub = rb_intern("sub");
20
+ VALUE w = Qundef, abs, re, im, sgn, n;
20
21
 
21
22
  rb_check_precise(prec);
23
+ n = rb_numdiff_make_n(prec);
22
24
 
23
- if (!rb_num_finite_p(z))
24
- {
25
- int re_sgn, im_sgn;
26
- if ((re_sgn = rb_num_infinite_p(rb_num_real(z)) != 0) &&
27
- (rb_num_infinite_p(rb_num_imag(z))) != 0)
28
- {
29
- switch (re_sgn) {
30
- case 1:
31
- w = rb_Complex1(BIG_INF);
32
- break;
33
- case -1:
34
- w = rb_Complex(BIG_ZERO, BIG_INF);
35
- break;
36
- }
37
- }
38
- else if ((im_sgn = rb_num_infinite_p(rb_num_imag(z))) != 0)
39
- {
40
- w = rb_Complex(
41
- BIG_INF,
42
- rb_num_coerce_bin(im_sgn, BIG_INF, '*')
43
- );
44
- }
45
- else
46
- {
47
- w = rb_Complex(BIG_NAN, BIG_NAN);
48
- }
49
- }
50
- else // if (rb_num_finite_p(z))
51
- {
52
- const ID add = rb_intern("add"), sub = rb_intern("sub");
53
- VALUE abs = rb_bigmath_cabs(z, prec),
54
- re = csqrt_term(abs, rb_num_real(z), prec, add),
55
- im = csqrt_term(abs, rb_num_real(z), prec, sub),
56
- sgn = rb_num_cmpeql(rb_num_imag(z), INT2NUM(0));
57
- if (rb_num_nonzero_p(sgn))
58
- w = rb_Complex(re, rb_num_coerce_bin(sgn, im, '*'));
59
- else
60
- w = rb_Complex(re, im);
61
- }
62
- if (w == Qundef)
63
- rb_raise(rb_eRuntimeError, "no solution");
25
+ abs = rb_bigmath_cabs(z, n);
26
+ re = csqrt_term(abs, rb_num_real(z), n, add);
27
+ im = csqrt_term(abs, rb_num_real(z), n, sub);
28
+ sgn = rb_num_cmpeql(rb_num_imag(z), INT2NUM(0));
64
29
 
65
- return w;
30
+ if (rb_num_nonzero_p(sgn))
31
+ w = rb_Complex(re, rb_num_coerce_bin(sgn, im, '*'));
32
+ else
33
+ w = rb_Complex(re, im);
34
+
35
+ return rb_num_round(w, prec);
66
36
  }
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  ctan_eulerf(VALUE z, VALUE prec)
3
3
  {
4
- VALUE w;
4
+ VALUE w, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- w = trig_f_euler(mf_tan, rb_ImaginaryZ(z, SIGN_PLUS), prec);
9
+ w = trig_f_euler(mf_tan, rb_ImaginaryZ(z, SIGN_PLUS), n);
9
10
 
10
- return w;
11
+ return rb_num_round(w, prec);
11
12
  }
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  ctanh_eulerf(VALUE z, VALUE prec)
3
3
  {
4
- VALUE w;
4
+ VALUE w, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- w = rb_ImaginaryZ(trig_f_euler(mf_tan, z, prec), SIGN_PLUS);
9
+ w = rb_ImaginaryZ(trig_f_euler(mf_tan, z, n), SIGN_PLUS);
9
10
 
10
- return w;
11
+ return rb_num_round(w, prec);
11
12
  }
@@ -0,0 +1,18 @@
1
+ VALUE
2
+ cuberoot_branch(VALUE x, VALUE prec, bigmath_func1 cuberoot_cb)
3
+ {
4
+ bool positive;
5
+
6
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
7
+
8
+ if (!rb_num_finite_p(x) || rb_num_zero_p(x))
9
+ return x;
10
+ positive = rb_num_positive_p(x) ? true : false;
11
+
12
+ if (!positive)
13
+ x = rb_num_uminus(x);
14
+
15
+ x = cuberoot_cb(x, prec);
16
+
17
+ return positive ? x : rb_num_uminus(x);
18
+ }
@@ -2,19 +2,11 @@ VALUE
2
2
  cuberoot_newton(VALUE x, VALUE prec)
3
3
  {
4
4
  const ID div = rb_intern("div");
5
- VALUE s = Qundef, t = Qundef, prev = Qundef;
5
+ VALUE s = Qundef, t = Qundef, prev = Qundef, n;
6
6
  VALUE two, three;
7
- bool positive;
8
7
 
9
- x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
10
8
  rb_check_precise(prec);
11
-
12
- if (!rb_num_finite_p(x) || rb_num_zero_p(x))
13
- return x;
14
- positive = rb_num_positive_p(x) ? true : false;
15
-
16
- if (!positive)
17
- x = rb_num_uminus(x);
9
+ n = rb_numdiff_make_n(prec);
18
10
 
19
11
  if (RTEST(rb_num_coerce_cmp(x, INT2FIX(1), '>')))
20
12
  s = x;
@@ -29,7 +21,7 @@ cuberoot_newton(VALUE x, VALUE prec)
29
21
  t = rb_funcall1(s, '*', s);
30
22
  t = rb_funcall1(x, '/', t);
31
23
  t = rb_funcall1(t, '+', rb_funcall1(two, '*', s));
32
- s = rb_funcall(t, div, 2, three, prec);
24
+ s = rb_funcall(t, div, 2, three, n);
33
25
  } while (RTEST(rb_num_coerce_cmp(s, prev, '<')));
34
26
 
35
27
  RB_GC_GUARD(s);
@@ -38,5 +30,5 @@ cuberoot_newton(VALUE x, VALUE prec)
38
30
  RB_GC_GUARD(two);
39
31
  RB_GC_GUARD(three);
40
32
 
41
- return positive ? prev : rb_num_uminus(prev);
33
+ return rb_num_round(prev, prec);
42
34
  }
@@ -4,15 +4,18 @@ erf_algo911(VALUE x, VALUE prec)
4
4
  const ID div = rb_intern("div");
5
5
  const ID leq = rb_intern("<=");
6
6
  const ID pow = rb_intern("**");
7
- VALUE absx, bc, n, y = Qundef;
7
+ VALUE absx, bc, log10, n, y = Qundef;
8
8
  VALUE zero_six = rb_BigDecimal1(rb_str_new_cstr("0.6"));
9
9
  VALUE four_one = rb_BigDecimal1(rb_str_new_cstr("4.1"));
10
10
 
11
+ rb_check_precise(prec);
11
12
  n = rb_numdiff_make_n(prec);
12
13
 
13
14
  absx = rb_num_abs(x);
14
- bc = rb_BigDecimal1(rb_funcall1(prec, '+', INT2FIX(21)));
15
- bc = rb_funcall1(bc, '*', rb_bigmath_log(INT2FIX(10), n));
15
+ log10 = rb_bigmath_const_log10(n);
16
+
17
+ bc = rb_BigDecimal1(rb_funcall1(n, '+', INT2FIX(21)));
18
+ bc = rb_funcall1(bc, '*', log10);
16
19
  bc = rb_bigmath_sqrt(bc, n);
17
20
  bc = rb_funcall(bc, div, 2, INT2FIX(5), n);
18
21
  if (rb_num_coerce_cmp(absx, bc, leq))
@@ -21,7 +24,7 @@ erf_algo911(VALUE x, VALUE prec)
21
24
  goto retval;
22
25
  }
23
26
  bc = rb_funcall1(prec, '+', INT2FIX(6));
24
- bc = rb_funcall1(bc, '*', rb_bigmath_log(INT2FIX(10), n));
27
+ bc = rb_funcall1(bc, '*', log10);
25
28
  bc = rb_funcall1(bc, pow, zero_six);
26
29
  bc = rb_funcall(bc, div, 2, four_one, n);
27
30
  if (rb_num_coerce_cmp(absx, bc, leq))
@@ -4,6 +4,7 @@ erf_cf(VALUE x, VALUE prec)
4
4
  const ID div = rb_intern("div");
5
5
  VALUE n, zero, one, two, c, b, p1, q1, p2, q2, i, prev, t;
6
6
 
7
+ rb_check_precise(prec);
7
8
  n = rb_numdiff_make_n(prec);
8
9
 
9
10
  zero = BIG_ZERO;
@@ -5,6 +5,7 @@ erf_ser_inf(VALUE x, VALUE prec)
5
5
  const ID mult = rb_intern("mult");
6
6
  VALUE n, m, s, zero, one, two, x2, f, r, i, i2, d, y;
7
7
 
8
+ rb_check_precise(prec);
8
9
  n = rb_numdiff_make_n(prec);
9
10
 
10
11
  s = rb_bigmath_exp(rb_funcall1(rb_num_uminus(x), '*', x), n);
@@ -5,6 +5,7 @@ erf_ser_zero(VALUE x, VALUE prec)
5
5
  const ID mult = rb_intern("mult");
6
6
  VALUE n, m, zero, one, two, x2, f, r, i, d, y;
7
7
 
8
+ rb_check_precise(prec);
8
9
  n = rb_numdiff_make_n(prec);
9
10
 
10
11
  zero = BIG_ZERO;
@@ -4,14 +4,17 @@ erfc_algo911(VALUE x, VALUE prec)
4
4
  const ID div = rb_intern("div");
5
5
  const ID leq = rb_intern("<=");
6
6
  const ID pow = rb_intern("**");
7
- VALUE bc, n, y = Qundef;
7
+ VALUE bc, n, log10, y = Qundef;
8
8
  VALUE zero_seven = rb_BigDecimal1(rb_str_new_cstr("0.7"));
9
9
  VALUE nine = rb_BigDecimal1(INT2FIX(9));
10
10
 
11
+ rb_check_precise(prec);
11
12
  n = rb_numdiff_make_n(prec);
12
13
 
14
+ log10 = rb_bigmath_const_log10(n);
15
+
13
16
  bc = rb_funcall1(prec, '+', INT2FIX(6));
14
- bc = rb_funcall1(bc, '*', rb_bigmath_log(INT2FIX(10), n));
17
+ bc = rb_funcall1(bc, '*', log10);
15
18
  bc = rb_funcall1(bc, pow, zero_seven);
16
19
  bc = rb_funcall(bc, div, 2, nine, n);
17
20
  if (rb_num_coerce_cmp(x, bc, leq))
@@ -4,6 +4,7 @@ erfc_cf(VALUE x, VALUE prec)
4
4
  const ID div = rb_intern("div");
5
5
  VALUE n, zero, one, two, c, b, p1, q1, p2, q2, i, prev, t;
6
6
 
7
+ rb_check_precise(prec);
7
8
  n = rb_numdiff_make_n(prec);
8
9
 
9
10
  zero = BIG_ZERO;
@@ -8,6 +8,8 @@ escalb_edf(VALUE a, VALUE x, VALUE prec, VALUE *exp, VALUE *fra)
8
8
  const ID MAX_10_EXP = rb_intern("MAX_10_EXP");
9
9
  VALUE max_10_exp = rb_const_get_at(rb_cFloat, MAX_10_EXP);
10
10
 
11
+ rb_check_precise(prec);
12
+
11
13
  if (!rb_num_finite_p(a) && !rb_num_positive_p(a))
12
14
  rb_raise(rb_eRangeError, "parameter a must be positive finite");
13
15
  switch (TYPE(x)) {
@@ -1,6 +1,12 @@
1
1
  VALUE
2
2
  exp_builtin(VALUE x, VALUE prec)
3
3
  {
4
- VALUE y = rb_funcall(rb_mBigMath, mf_exp, 2, x, prec);
4
+ VALUE y, n;
5
+
6
+ rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
8
+
9
+ y = rb_funcall(rb_mBigMath, mf_exp, 2, x, n);
10
+
5
11
  return rb_num_round(y, prec);
6
12
  }
@@ -2,22 +2,23 @@ VALUE
2
2
  exp_edf(VALUE x, VALUE prec)
3
3
  {
4
4
  const ID mult = rb_intern("mult");
5
- VALUE exp = Qundef, fra = Qundef;
5
+ VALUE exp = Qundef, fra = Qundef, n;
6
6
 
7
7
  rb_check_precise(prec);
8
+ n = rb_numdiff_make_n(prec);
8
9
 
9
10
  if (rb_num_notequal_p(x, x))
10
11
  return BIG_NAN;
11
- rb_bigmath_escalb(rb_bigmath_const_e(prec), x, prec, &exp, &fra);
12
+ rb_bigmath_escalb(rb_bigmath_const_e(n), x, n, &exp, &fra);
12
13
  if (exp == Qundef || fra == Qundef)
13
14
  rb_raise(rb_eRuntimeError, "no solution");
14
15
  if (rb_num_infinite_p(exp) ||
15
16
  rb_num_zero_p(exp) ||
16
17
  rb_num_zero_p(fra))
17
- return rb_num_round(exp, prec);
18
- fra = rb_bigmath_expxt(fra, BIG_ONE, prec);
18
+ return rb_num_round(exp, n);
19
+ fra = rb_bigmath_expxt(fra, BIG_ONE, n);
19
20
  if (CLASS_OF(exp) != rb_cBigDecimal)
20
- exp = rb_num_canonicalize(exp, prec, ARG_REAL, ARG_RAWVALUE);
21
+ exp = rb_num_canonicalize(exp, n, ARG_REAL, ARG_RAWVALUE);
21
22
 
22
23
  return rb_funcall(exp, mult, 2, fra, prec);
23
24
  }
@@ -2,18 +2,22 @@ VALUE
2
2
  exp2_edf(VALUE x, VALUE prec)
3
3
  {
4
4
  const ID mult = rb_intern("mult");
5
- VALUE exp = Qundef, fra = Qundef;
5
+ VALUE exp = Qundef, fra = Qundef, n;
6
+
7
+ rb_check_precise(prec);
8
+ n = rb_numdiff_make_n(prec);
9
+
6
10
  if (rb_num_notequal_p(x, x))
7
11
  return BIG_NAN;
8
- rb_bigmath_escalb(INT2FIX(2), x, prec, &exp, &fra);
12
+ rb_bigmath_escalb(INT2FIX(2), x, n, &exp, &fra);
9
13
  if (exp == Qundef || fra == Qundef)
10
14
  rb_raise(rb_eRuntimeError, "no solution");
11
15
  if (rb_num_infinite_p(exp) ||
12
16
  rb_num_zero_p(exp) ||
13
17
  rb_num_zero_p(fra))
14
- return rb_num_round(exp, prec);
15
- fra = rb_bigmath_expxt(fra, rb_bigmath_const_log2(prec), prec);
18
+ return rb_num_round(exp, n);
19
+ fra = rb_bigmath_expxt(fra, rb_bigmath_const_log2(n), n);
16
20
  if (CLASS_OF(exp) != rb_cBigDecimal)
17
- exp = rb_num_canonicalize(exp, prec, ARG_REAL, ARG_RAWVALUE);
21
+ exp = rb_num_canonicalize(exp, n, ARG_REAL, ARG_RAWVALUE);
18
22
  return rb_funcall(exp, mult, 2, fra, prec);
19
23
  }
@@ -0,0 +1,13 @@
1
+ VALUE
2
+ expm1_branch(VALUE x, VALUE prec, bigmath_func1 expm1_cb)
3
+ {
4
+ VALUE w = Qundef;
5
+
6
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
7
+
8
+ if (rb_num_nan_p(x))
9
+ w = BIG_NAN;
10
+ else
11
+ w = expm1_cb(x, prec);
12
+ return w;
13
+ }
@@ -0,0 +1,18 @@
1
+ VALUE
2
+ expm1_identity(VALUE x, VALUE prec)
3
+ {
4
+ const ID mult = rb_intern("mult");
5
+ VALUE y = Qundef;
6
+ VALUE two = rb_BigDecimal1(INT2FIX(2));
7
+ VALUE n;
8
+
9
+ rb_check_precise(prec);
10
+ n = rb_numdiff_make_n(prec);
11
+
12
+ x = rb_funcall1(x, '/', two);
13
+
14
+ y = rb_funcall1(rb_bigmath_exp(x, n), '*', sinh_branch(x, n, sinh_formula));
15
+ y = rb_funcall(two, mult, 2, y, prec);
16
+
17
+ return y;
18
+ }
@@ -7,8 +7,8 @@ expxt_edf(VALUE x, VALUE t, VALUE prec)
7
7
  long i = 0;
8
8
 
9
9
  rb_check_precise(prec);
10
-
11
10
  n = rb_numdiff_make_n(prec), m;
11
+
12
12
  a = BIG_ONE;
13
13
  xt = rb_funcall1(x, '*', t);
14
14
  e = BIG_ZERO;
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  f_euler_formula(VALUE theta, VALUE prec)
3
3
  {
4
- VALUE sin, cos;
4
+ VALUE sin, cos, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- rb_bigmath_sincos(theta, prec, &sin, &cos);
9
+ rb_bigmath_sincos(theta, n, &sin, &cos);
9
10
 
10
11
  return rb_Complex(cos, sin);
11
12
  }
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  hypot_l2norm(VALUE a, VALUE b, VALUE prec)
3
3
  {
4
- VALUE w;
4
+ VALUE w, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
8
+
9
+ w = rb_bigmath_l2norm(rb_assoc_new(a, b), n);
7
10
 
8
- w = rb_bigmath_l2norm(rb_assoc_new(a, b), prec);
9
-
10
- return w;
11
+ return rb_num_round(w, prec);
11
12
  }
@@ -6,8 +6,8 @@ hypot_mmm(VALUE a, VALUE b, VALUE prec)
6
6
  VALUE n, m, two, four, t;
7
7
 
8
8
  rb_check_precise(prec);
9
-
10
9
  n = rb_numdiff_make_n(prec);
10
+
11
11
  m = Qundef;
12
12
  two = rb_BigDecimal1(INT2FIX(2));
13
13
  four = rb_BigDecimal1(INT2FIX(4));
@@ -7,11 +7,12 @@ ipow_edf(VALUE x, VALUE n, VALUE exp)
7
7
  const ID geq = rb_intern(">=");
8
8
  VALUE abs_n = Qundef, r = Qundef;
9
9
 
10
+ rb_check_precise(exp);
11
+
10
12
  if (!rb_num_finite_p(x))
11
13
  return BIG_NAN;
12
14
  x = rb_num_canonicalize(x, exp, ARG_REAL, ARG_RAWVALUE);
13
- abs_n = n;
14
- if (rb_num_negative_p(n)) abs_n = rb_num_uminus(abs_n); // abs()
15
+ abs_n = rb_num_abs(n);
15
16
  r = BIG_ONE;
16
17
  while (rb_num_nonzero_p(abs_n))
17
18
  {
@@ -28,6 +29,7 @@ ipow_edf(VALUE x, VALUE n, VALUE exp)
28
29
  abs_n = rb_num_coerce_bit(abs_n, INT2FIX(1), r_shift);
29
30
  }
30
31
 
31
- return RTEST(rb_num_coerce_cmp(n, INT2FIX(0), geq)) ?
32
- r : rb_funcall1(INT2FIX(1), '/', r);
32
+ if (!RTEST(rb_num_coerce_cmp(n, INT2FIX(0), geq)))
33
+ r = rb_funcall1(BIG_ONE, '/', r);
34
+ return r;
33
35
  }
@@ -42,7 +42,12 @@ bigmath_l2norm(VALUE vec, VALUE prec)
42
42
  VALUE
43
43
  l2norm_formula(VALUE vec, VALUE prec)
44
44
  {
45
+ VALUE y, n;
46
+
45
47
  rb_check_precise(prec);
48
+ n = rb_numdiff_make_n(prec);
49
+
50
+ y = bigmath_l2norm(vec, n);
46
51
 
47
- return bigmath_l2norm(vec, prec);
52
+ return rb_num_round(y, prec);
48
53
  }
@@ -1,7 +1,7 @@
1
1
  VALUE
2
2
  log_branch(VALUE x, VALUE prec, bigmath_func1 log_cb)
3
3
  {
4
- VALUE y = Qundef;
4
+ VALUE y = Qundef, n;
5
5
 
6
6
  x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
7
7
 
@@ -27,8 +27,12 @@ log_branch(VALUE x, VALUE prec, bigmath_func1 log_cb)
27
27
  {
28
28
  const ID add = rb_intern("add");
29
29
  VALUE exp, fra;
30
+
31
+ rb_check_precise(prec);
32
+ n = rb_numdiff_make_n(prec);
33
+
30
34
  fra = rcm2_edf(x, &exp);
31
- exp = rb_funcall1(rb_bigmath_const_log2(prec), '*', exp);
35
+ exp = rb_funcall1(rb_bigmath_const_log2(n), '*', exp);
32
36
  fra = log_cb(fra, prec);
33
37
  y = rb_funcall(exp, add, 2, fra, prec);
34
38
  }
@@ -2,11 +2,12 @@ VALUE
2
2
  log_builtin(VALUE x, VALUE prec)
3
3
  {
4
4
  const ID log = rb_intern("log");
5
- VALUE y;
5
+ VALUE y, n;
6
6
 
7
7
  rb_check_precise(prec);
8
+ n = rb_numdiff_make_n(prec);
8
9
 
9
- y = rb_funcall(rb_mBigMath, log, 2, x, prec);
10
+ y = rb_funcall(rb_mBigMath, log, 2, x, n);
10
11
 
11
12
  return rb_num_round(y, prec);
12
13
  }
@@ -1,10 +1,13 @@
1
1
  VALUE
2
2
  log_edf(VALUE x, VALUE prec)
3
3
  {
4
- VALUE fra = Qundef, exp = Qundef, y = Qundef;
5
- fra = rcm2_edf(x, &exp);
6
- fra = logxt_edf(fra, INT2FIX(2), prec);
7
- y = rb_funcall1(exp, '+', fra);
8
- y = rb_funcall1(y, '*', rb_bigmath_const_log2(prec));
4
+ VALUE y = Qundef, n;
5
+
6
+ rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
8
+
9
+ y = logxt_edf(x, INT2FIX(2), n);
10
+ y = rb_funcall1(y, '*', rb_bigmath_const_log2(n));
11
+
9
12
  return rb_num_round(y, prec);
10
13
  }
@@ -1,10 +1,16 @@
1
1
  VALUE
2
2
  log_edom(VALUE x, VALUE prec)
3
3
  {
4
- VALUE y, pi = rb_bigmath_const_pi(prec);
5
- x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
4
+ VALUE y, pi = rb_bigmath_const_pi(prec), n;
5
+
6
+ rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
8
+
9
+ x = rb_num_canonicalize(x, n, ARG_REAL, ARG_RAWVALUE);
6
10
  RUBY_ASSERT (rb_num_negative_p(x));
7
11
  x = rb_num_uminus(x);
8
- y = rb_bigmath_log(x, prec);
9
- return rb_Complex(y, pi);
12
+ y = rb_bigmath_log(x, n);
13
+ y = rb_Complex(y, pi);
14
+
15
+ return rb_num_round(y, prec);
10
16
  }
@@ -17,18 +17,16 @@ VALUE
17
17
  log_mercator(VALUE x, VALUE prec)
18
18
  {
19
19
  const ID div = rb_intern("div");
20
- VALUE fra = Qundef, exp = Qundef, y = Qundef;
21
- fra = rcm2_edf(x, &exp);
20
+ VALUE temp = Qundef, y = Qundef, n;
22
21
 
23
22
  rb_check_precise(prec);
23
+ n = rb_numdiff_make_n(prec);
24
24
 
25
- y = rb_funcall1(fra, '-', INT2FIX(1));
26
- fra = rb_funcall(y, div, 2, fra, prec);
27
- fra = rb_num_uminus(fra);
28
- fra = log1p_ser_mercator(fra, prec);
29
- fra = rb_num_uminus(fra);
25
+ y = rb_funcall1(temp, '-', INT2FIX(1));
26
+ temp = rb_funcall(y, div, 2, temp, n);
27
+ temp = rb_num_uminus(temp);
28
+ temp = log1p_ser_mercator(temp, n);
29
+ y = rb_num_uminus(temp);
30
30
 
31
- exp = rb_funcall1(exp, '*', rb_bigmath_const_log2(prec));
32
- y = rb_funcall1(exp, '+', fra);
33
31
  return rb_num_round(y, prec);
34
32
  }
@@ -9,8 +9,11 @@ log_ser_okumura(VALUE x, VALUE prec)
9
9
  bool inv;
10
10
  VALUE one = BIG_ONE;
11
11
  VALUE two = rb_BigDecimal1(INT2FIX(2));
12
- VALUE n = rb_numdiff_make_n(prec), m;
12
+ VALUE n, m;
13
13
  VALUE k, x2, i, s, d, y;
14
+
15
+ rb_check_precise(prec);
16
+ n = rb_numdiff_make_n(prec);
14
17
 
15
18
  inv = RTEST(rb_num_coerce_cmp(x, INT2FIX(1), '>'));
16
19
  if (inv)
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  log10_edf(VALUE x, VALUE prec)
3
3
  {
4
- VALUE y = Qundef;
4
+ VALUE y = Qundef, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- y = logxt_edf(x, INT2FIX(10), prec);
9
+ y = logxt_edf(x, INT2FIX(10), n);
9
10
 
10
11
  return rb_num_round(y, prec);
11
12
  }
@@ -17,19 +17,19 @@ VALUE
17
17
  log10_mercator(VALUE x, VALUE prec)
18
18
  {
19
19
  const ID div = rb_intern("div");
20
- VALUE fra = Qundef, exp = Qundef, y = Qundef;
20
+ VALUE temp = Qundef, y = Qundef, n;
21
21
 
22
22
  rb_check_precise(prec);
23
+ n = rb_numdiff_make_n(prec);
23
24
 
24
- fra = rcm10_edf(x, &exp);
25
+ y = rb_funcall1(x, '-', INT2FIX(1));
26
+ temp = rb_funcall(y, div, 2, temp, n);
27
+ temp = rb_num_uminus(temp);
28
+ temp = log1p_ser_mercator(temp, n);
29
+ temp = rb_num_uminus(temp);
30
+ temp = rb_funcall(temp, div, 2, rb_bigmath_const_log10(n), n);
25
31
 
26
- y = rb_funcall1(fra, '-', INT2FIX(1));
27
- fra = rb_funcall(y, div, 2, fra, prec);
28
- fra = rb_num_uminus(fra);
29
- fra = log1p_ser_mercator(fra, prec);
30
- fra = rb_num_uminus(fra);
31
- fra = rb_funcall(fra, div, 2, rb_bigmath_const_log10(prec), prec);
32
+ y = temp;
32
33
 
33
- y = rb_funcall1(exp, '+', fra);
34
34
  return rb_num_round(y, prec);
35
35
  }
@@ -1,8 +1,8 @@
1
1
  VALUE
2
- log1p_branch(VALUE x, VALUE prec, bigmath_func1 cb)
2
+ log1p_branch(VALUE x, VALUE prec, bigmath_func1 log1p_cb)
3
3
  {
4
4
  VALUE y = Qundef;
5
- VALUE one_thousand = rb_Rational(INT2FIX(1), INT2FIX(1000));
5
+ VALUE one_thousand = rb_Rational(INT2FIX(1), INT2FIX(1000)), n;
6
6
  const ID geq = rb_intern_const(">=");
7
7
  const ID gt = rb_intern_const(">");
8
8
 
@@ -13,20 +13,23 @@ log1p_branch(VALUE x, VALUE prec, bigmath_func1 cb)
13
13
  if (rb_num_nan_p(x))
14
14
  y = BIG_NAN;
15
15
  else
16
- y = log_branch(x, prec, cb);
16
+ y = log_branch(x, prec, log1p_cb);
17
17
  }
18
18
  if (y == Qundef)
19
19
  {
20
20
  if (rb_num_zero_p(x))
21
21
  y = BIG_ZERO;
22
22
  else if (RTEST(rb_num_coerce_cmp(one_thousand, rb_num_abs(x), geq)))
23
- y = cb(x, prec);
23
+ y = log1p_cb(x, prec);
24
24
  else if (RTEST(rb_num_coerce_cmp(INT2FIX(-1), x, gt)))
25
25
  y = BIG_NAN;
26
26
  else
27
27
  {
28
+ rb_check_precise(prec);
29
+ n = rb_numdiff_make_n(prec);
30
+
28
31
  x = rb_funcall1(x, '+', BIG_ONE);
29
- y = rb_bigmath_log(x, prec);
32
+ y = rb_bigmath_log(x, n);
30
33
  y = rb_num_round(y, prec);
31
34
  }
32
35
  }