bigdecimal-math_r 0.2.1 → 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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/changelog.md +14 -0
  3. data/ext/bigdecimal/math_r/algofunc.h +11 -1
  4. data/ext/bigdecimal/math_r/api/bigmath/const_e.h +1 -1
  5. data/ext/bigdecimal/math_r/api/bigmath/const_euler_gamma.h +5 -0
  6. data/ext/bigdecimal/math_r/api/bigmath/csqrt.h +1 -1
  7. data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal_flo.h +8 -2
  8. data/ext/bigdecimal/math_r/api/numeric/nan_p.h +4 -1
  9. data/ext/bigdecimal/math_r/api.h +2 -0
  10. data/ext/bigdecimal/math_r/const.c +42 -5
  11. data/ext/bigdecimal/math_r/decl.h +11 -1
  12. data/ext/bigdecimal/math_r/exp.c +45 -3
  13. data/ext/bigdecimal/math_r/extconf.rb +5 -1
  14. data/ext/bigdecimal/math_r/{gamma_r.c → gamma_beta.c} +11 -78
  15. data/ext/bigdecimal/math_r/internal/algo/bigmath/E/{ser.h → napier.h} +1 -1
  16. data/ext/bigdecimal/math_r/internal/algo/bigmath/EulerGamma/borwein_bailey.h +37 -0
  17. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG10/ser.h +4 -2
  18. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG_PI/builtin.h +3 -1
  19. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT2/builtin.h +4 -1
  20. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT3/builtin.h +4 -1
  21. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/edom.h +7 -5
  22. data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/logrep.h +9 -6
  23. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/edom.h +4 -3
  24. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/logrep.h +5 -2
  25. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/edom.h +7 -6
  26. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/logrep.h +6 -5
  27. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/logrep.h +7 -6
  28. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/edom.h +7 -6
  29. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/logrep.h +8 -7
  30. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/edom.h +10 -6
  31. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/logrep.h +3 -2
  32. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/edom.h +6 -5
  33. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/logrep.h +3 -2
  34. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/ser.h +1 -0
  35. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/logrep.h +6 -5
  36. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/ser.h +1 -0
  37. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/logrep.h +7 -6
  38. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_euler.h +2 -0
  39. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/edom.h +6 -3
  40. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/logrep.h +2 -0
  41. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/ser.h +1 -0
  42. data/ext/bigdecimal/math_r/internal/algo/bigmath/cabs/formula.h +6 -2
  43. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/logrep.h +7 -4
  44. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/logrep.h +6 -5
  45. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/logrep.h +3 -2
  46. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/logrep.h +8 -4
  47. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/logrep.h +5 -4
  48. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/logrep.h +7 -3
  49. data/ext/bigdecimal/math_r/internal/algo/bigmath/carg/formula.h +6 -2
  50. data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/logrep.h +5 -4
  51. data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/logrep.h +3 -1
  52. data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/logrep.h +6 -4
  53. data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/logrep.h +1 -0
  54. data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/logrep.h +3 -2
  55. data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/logrep.h +5 -2
  56. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/branch.h +40 -0
  57. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/formula.h +5 -2
  58. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/eulerf.h +4 -3
  59. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/eulerf.h +4 -3
  60. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/eulerf.h +5 -3
  61. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/eulerf.h +4 -2
  62. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/eulerf.h +4 -2
  63. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/eulerf.h +5 -3
  64. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/eulerf.h +10 -7
  65. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/eulerf.h +5 -3
  66. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexpm1/branch.h +13 -0
  67. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexpm1/identity.h +17 -0
  68. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/branch.h +11 -12
  69. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/branch.h +53 -0
  70. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/formula.h +4 -3
  71. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/branch.h +53 -0
  72. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/formula.h +4 -3
  73. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/eulerf.h +6 -4
  74. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/ser.h +4 -4
  75. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/eulerf.h +5 -3
  76. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/formula.h +5 -5
  77. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/ser.h +4 -3
  78. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/eulerf.h +5 -3
  79. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/ser.h +3 -2
  80. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/eulerf.h +4 -2
  81. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/formula.h +1 -0
  82. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/ser.h +3 -2
  83. data/ext/bigdecimal/math_r/internal/algo/bigmath/cpow/formula.h +7 -6
  84. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/eulerf.h +4 -2
  85. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/ser.h +5 -3
  86. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/eulerf.h +5 -3
  87. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/formula.h +2 -2
  88. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/ser.h +6 -3
  89. data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/eulerf.h +5 -3
  90. data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/eulerf.h +5 -3
  91. data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/eulerf.h +4 -3
  92. data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/eulerf.h +4 -3
  93. data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/branch.h +40 -0
  94. data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/formula.h +13 -43
  95. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/eulerf.h +4 -3
  96. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/eulerf.h +4 -3
  97. data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/branch.h +18 -0
  98. data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/newton.h +4 -12
  99. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/algo911.h +7 -4
  100. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/cf.h +1 -0
  101. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_inf.h +1 -0
  102. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_zero.h +1 -0
  103. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/algo911.h +5 -2
  104. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/cf.h +1 -0
  105. data/ext/bigdecimal/math_r/internal/algo/bigmath/escalb/edf.h +2 -0
  106. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/builtin.h +7 -1
  107. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/edf.h +6 -5
  108. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/edf.h +9 -5
  109. data/ext/bigdecimal/math_r/internal/algo/bigmath/expm1/branch.h +13 -0
  110. data/ext/bigdecimal/math_r/internal/algo/bigmath/expm1/identity.h +18 -0
  111. data/ext/bigdecimal/math_r/internal/algo/bigmath/expxt/edf.h +1 -1
  112. data/ext/bigdecimal/math_r/internal/algo/bigmath/f_euler/formula.h +3 -2
  113. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/l2norm.h +5 -4
  114. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/mmm.h +1 -1
  115. data/ext/bigdecimal/math_r/internal/algo/bigmath/ipow/edf.h +6 -4
  116. data/ext/bigdecimal/math_r/internal/algo/bigmath/l2norm/formula.h +6 -1
  117. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/branch.h +6 -2
  118. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/builtin.h +3 -2
  119. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edf.h +8 -5
  120. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edom.h +10 -4
  121. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/mercator.h +7 -9
  122. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/ser_okumura.h +4 -1
  123. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/edf.h +3 -2
  124. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/mercator.h +9 -9
  125. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/branch.h +8 -5
  126. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/ser_mercator.h +16 -6
  127. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/branch.h +1 -1
  128. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/edf.h +3 -2
  129. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/mercator.h +9 -9
  130. data/ext/bigdecimal/math_r/internal/algo/bigmath/logxt/edf.h +6 -1
  131. data/ext/bigdecimal/math_r/internal/algo/bigmath/pow/formula.h +13 -8
  132. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm10/edf.h +10 -4
  133. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm2/edf.h +11 -3
  134. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/eulerf.h +5 -3
  135. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/ser.h +6 -4
  136. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/eulerf.h +5 -3
  137. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/formula.h +8 -4
  138. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/ser.h +5 -3
  139. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/eulerf.h +5 -2
  140. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/ser.h +4 -5
  141. data/ext/bigdecimal/math_r/internal/algo/bigmath/sincos/ser.h +9 -2
  142. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/eulerf.h +5 -3
  143. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/formula.h +8 -4
  144. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/ser.h +4 -3
  145. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinhcosh/ser.h +10 -3
  146. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/builtin.h +2 -2
  147. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/edom.h +1 -0
  148. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/eulerf.h +5 -3
  149. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/ser.h +3 -8
  150. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/eulerf.h +5 -3
  151. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/formula.h +7 -3
  152. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/ser.h +3 -3
  153. data/ext/bigdecimal/math_r/internal/algo/bigmath/trig/f_euler.h +11 -5
  154. data/ext/bigdecimal/math_r/log.c +2 -2
  155. data/ext/bigdecimal/math_r/math_r/bigdecimal.h +5 -1
  156. data/ext/bigdecimal/math_r/math_r/bigmath.h +2 -0
  157. data/ext/bigdecimal/math_r/math_r/globals.h +1 -1
  158. data/ext/bigdecimal/math_r/math_r.c +5 -3
  159. data/lib/bigdecimal/math_r/const/E_euler.rb +46 -0
  160. data/lib/bigdecimal/math_r/version.rb +1 -1
  161. data/lib/bigdecimal/math_r.rb +1 -0
  162. metadata +20 -10
  163. data/.ruby-version +0 -1
  164. data/lib/bigdecimal/math_r.so +0 -0
@@ -1,11 +1,13 @@
1
1
  VALUE
2
2
  csc_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
9
  w = trig_f_euler(mf_sin, rb_ImaginaryZ(z, SIGN_PLUS), prec);
10
+ w = rb_num_canonicalize(w, n, ARG_REAL, ARG_RECIPROCAL);
9
11
 
10
- return rb_num_canonicalize(w, prec, ARG_REAL, ARG_RECIPROCAL);
12
+ return rb_num_round(w, prec);
11
13
  }
@@ -1,11 +1,13 @@
1
1
  VALUE
2
2
  csc_ser(VALUE x, VALUE prec)
3
3
  {
4
- VALUE sin;
4
+ VALUE sin, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- rb_bigmath_sincos(x, prec, &sin, NULL);
9
+ rb_bigmath_sincos(x, n, &sin, NULL);
10
+ sin = rb_num_canonicalize(sin, n, ARG_REAL, ARG_RECIPROCAL);
9
11
 
10
- return rb_num_canonicalize(sin, prec, ARG_REAL, ARG_RECIPROCAL);
12
+ return rb_num_round(sin, prec);
11
13
  }
@@ -1,11 +1,13 @@
1
1
  VALUE
2
2
  csch_eulerf(VALUE x, VALUE prec)
3
3
  {
4
- VALUE y;
4
+ VALUE y, n;
5
5
 
6
6
  rb_check_precise(prec);
7
+ n = rb_numdiff_make_n(prec);
7
8
 
8
- y = rb_ImaginaryZ(trig_f_euler(mf_sin, x, prec), SIGN_PLUS);
9
+ y = rb_ImaginaryZ(trig_f_euler(mf_sin, x, n), SIGN_PLUS);
10
+ y = rb_num_canonicalize(y, n, ARG_REAL, ARG_RECIPROCAL);
9
11
 
10
- return rb_num_canonicalize(y, prec, ARG_REAL, ARG_RECIPROCAL);
12
+ return rb_num_round(y, prec);
11
13
  }
@@ -6,8 +6,8 @@ csch_formula(VALUE x, VALUE prec)
6
6
  int sign;
7
7
 
8
8
  rb_check_precise(prec);
9
-
10
9
  n = rb_numdiff_make_n(prec);
10
+
11
11
  t = rb_bigmath_exp(x, n);
12
12
  y = Qundef;
13
13
  two = rb_BigDecimal1(INT2FIX(2));
@@ -22,7 +22,7 @@ csch_formula(VALUE x, VALUE prec)
22
22
  y = sign == 1 ? BIG_ZERO : BIG_MINUS_ZERO;
23
23
  else
24
24
  {
25
- y = rb_num_canonicalize(t, prec, ARG_REAL, ARG_RECIPROCAL);
25
+ y = rb_num_canonicalize(t, n, ARG_REAL, ARG_RECIPROCAL);
26
26
  y = rb_funcall1(t, '-', y);
27
27
  y = rb_funcall(two, div, 2, y, prec);
28
28
  }
@@ -1,11 +1,14 @@
1
1
  VALUE
2
2
  csch_ser(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
- sinhcosh_ser(x, prec, &y, NULL);
9
+ sinhcosh_ser(x, n, &y, NULL);
9
10
 
10
- return rb_num_canonicalize(y, prec, ARG_REAL, ARG_RECIPROCAL);
11
+ y = rb_num_canonicalize(y, n, ARG_REAL, ARG_RECIPROCAL);
12
+
13
+ return rb_num_round(y, prec);
11
14
  }
@@ -1,11 +1,13 @@
1
1
  VALUE
2
2
  csec_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_cos, rb_ImaginaryZ(z, SIGN_PLUS), prec);
9
+ w = trig_f_euler(mf_cos, rb_ImaginaryZ(z, SIGN_PLUS), n);
10
+ w = rb_num_canonicalize(w, n, ARG_COMPLEX, ARG_RECIPROCAL);
9
11
 
10
- return rb_num_canonicalize(w, prec, ARG_COMPLEX, ARG_RECIPROCAL);
12
+ return rb_num_round(w, prec);
11
13
  }
@@ -1,11 +1,13 @@
1
1
  VALUE
2
2
  csech_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_cos, z, prec);
9
+ w = trig_f_euler(mf_cos, z, n);
10
+ w = rb_num_canonicalize(w, n, ARG_COMPLEX, ARG_RECIPROCAL);
9
11
 
10
- return rb_num_canonicalize(w, prec, ARG_COMPLEX, ARG_RECIPROCAL);
12
+ return rb_num_round(w, prec);
11
13
  }
@@ -1,11 +1,12 @@
1
1
  VALUE
2
2
  csin_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_sin, rb_ImaginaryZ(z, SIGN_PLUS), prec);
9
+ w = trig_f_euler(mf_sin, 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
  csinh_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_sin, z, prec), SIGN_PLUS);
9
+ w = rb_ImaginaryZ(trig_f_euler(mf_sin, z, n), SIGN_PLUS);
9
10
 
10
- return w;
11
+ return rb_num_round(w, prec);
11
12
  }
@@ -0,0 +1,40 @@
1
+ VALUE
2
+ csqrt_branch(VALUE z, VALUE prec, bigmath_func1 csqrt_cb)
3
+ {
4
+ VALUE w = Qundef;
5
+
6
+ z = rb_num_canonicalize(z, prec, ARG_COMPLEX, ARG_RAWVALUE);
7
+
8
+ if (rb_num_nan_p(z))
9
+ {
10
+ w = rb_Complex(BIG_NAN, BIG_NAN);
11
+ }
12
+ else if (!rb_num_finite_p(z))
13
+ {
14
+ int re_sgn = rb_num_infinite_p(rb_num_real(z));
15
+ int im_sgn = rb_num_infinite_p(rb_num_imag(z));
16
+ if (re_sgn != 0 && im_sgn == 0)
17
+ {
18
+ switch (re_sgn) {
19
+ case 1:
20
+ w = rb_Complex1(BIG_INF);
21
+ break;
22
+ case -1:
23
+ w = rb_Complex(BIG_ZERO, BIG_INF);
24
+ break;
25
+ }
26
+ }
27
+ else
28
+ {
29
+ w = rb_Complex(
30
+ BIG_INF,
31
+ rb_num_coerce_bin(im_sgn, BIG_INF, '*')
32
+ );
33
+ }
34
+ }
35
+ if (w == Qundef)
36
+ {
37
+ w = csqrt_cb(z, prec);
38
+ }
39
+ return w;
40
+ }
@@ -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
  }