bigdecimal-math_r 0.2.0

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 (309) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CODE_OF_CONDUCT.md +132 -0
  4. data/LICENSE +21 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +13 -0
  8. data/changelog.md +24 -0
  9. data/ext/bigdecimal/math_r/algofunc.h +203 -0
  10. data/ext/bigdecimal/math_r/api/bigdecimal/check_precise.h +12 -0
  11. data/ext/bigdecimal/math_r/api/bigdecimal/infinity.h +6 -0
  12. data/ext/bigdecimal/math_r/api/bigdecimal/minus_infinity.h +5 -0
  13. data/ext/bigdecimal/math_r/api/bigdecimal/minus_one.h +6 -0
  14. data/ext/bigdecimal/math_r/api/bigdecimal/minus_zero.h +6 -0
  15. data/ext/bigdecimal/math_r/api/bigdecimal/nan.h +6 -0
  16. data/ext/bigdecimal/math_r/api/bigdecimal/one.h +6 -0
  17. data/ext/bigdecimal/math_r/api/bigdecimal/sign.h +10 -0
  18. data/ext/bigdecimal/math_r/api/bigdecimal/zero.h +6 -0
  19. data/ext/bigdecimal/math_r/api/bigmath/api_call1.h +5 -0
  20. data/ext/bigdecimal/math_r/api/bigmath/api_call2.h +6 -0
  21. data/ext/bigdecimal/math_r/api/bigmath/atan.h +7 -0
  22. data/ext/bigdecimal/math_r/api/bigmath/atan_adopt.h +42 -0
  23. data/ext/bigdecimal/math_r/api/bigmath/cabs.h +5 -0
  24. data/ext/bigdecimal/math_r/api/bigmath/carg.h +5 -0
  25. data/ext/bigdecimal/math_r/api/bigmath/cexp.h +5 -0
  26. data/ext/bigdecimal/math_r/api/bigmath/clog.h +5 -0
  27. data/ext/bigdecimal/math_r/api/bigmath/const.h +39 -0
  28. data/ext/bigdecimal/math_r/api/bigmath/const_e.h +5 -0
  29. data/ext/bigdecimal/math_r/api/bigmath/const_log10.h +5 -0
  30. data/ext/bigdecimal/math_r/api/bigmath/const_log2.h +5 -0
  31. data/ext/bigdecimal/math_r/api/bigmath/const_log_pi.h +5 -0
  32. data/ext/bigdecimal/math_r/api/bigmath/const_pi.h +5 -0
  33. data/ext/bigdecimal/math_r/api/bigmath/const_sqrt2.h +5 -0
  34. data/ext/bigdecimal/math_r/api/bigmath/const_sqrt3.h +5 -0
  35. data/ext/bigdecimal/math_r/api/bigmath/cpow.h +5 -0
  36. data/ext/bigdecimal/math_r/api/bigmath/csqrt.h +5 -0
  37. data/ext/bigdecimal/math_r/api/bigmath/degree_sparg.h +199 -0
  38. data/ext/bigdecimal/math_r/api/bigmath/escalb.h +5 -0
  39. data/ext/bigdecimal/math_r/api/bigmath/exp.h +5 -0
  40. data/ext/bigdecimal/math_r/api/bigmath/expxt.h +18 -0
  41. data/ext/bigdecimal/math_r/api/bigmath/hypot.h +10 -0
  42. data/ext/bigdecimal/math_r/api/bigmath/ipow.h +14 -0
  43. data/ext/bigdecimal/math_r/api/bigmath/l2norm.h +5 -0
  44. data/ext/bigdecimal/math_r/api/bigmath/log.h +7 -0
  45. data/ext/bigdecimal/math_r/api/bigmath/pow.h +5 -0
  46. data/ext/bigdecimal/math_r/api/bigmath/quadrant.h +5 -0
  47. data/ext/bigdecimal/math_r/api/bigmath/sincos.h +5 -0
  48. data/ext/bigdecimal/math_r/api/bigmath/sqrt.h +5 -0
  49. data/ext/bigdecimal/math_r/api/bigmath/to_rad.h +41 -0
  50. data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal.h +6 -0
  51. data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal1.h +6 -0
  52. data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal_flo.h +9 -0
  53. data/ext/bigdecimal/math_r/api/kernel/rb_ImaginaryZ.h +8 -0
  54. data/ext/bigdecimal/math_r/api/numanalysis/condition_p.h +26 -0
  55. data/ext/bigdecimal/math_r/api/numanalysis/make_n.h +9 -0
  56. data/ext/bigdecimal/math_r/api/numeric/abs.h +7 -0
  57. data/ext/bigdecimal/math_r/api/numeric/canonicalize.h +140 -0
  58. data/ext/bigdecimal/math_r/api/numeric/cmpeql.h +6 -0
  59. data/ext/bigdecimal/math_r/api/numeric/equal_p.h +6 -0
  60. data/ext/bigdecimal/math_r/api/numeric/finite_p.h +6 -0
  61. data/ext/bigdecimal/math_r/api/numeric/imag.h +6 -0
  62. data/ext/bigdecimal/math_r/api/numeric/infinite_p.h +7 -0
  63. data/ext/bigdecimal/math_r/api/numeric/nan_p.h +5 -0
  64. data/ext/bigdecimal/math_r/api/numeric/negative_p.h +6 -0
  65. data/ext/bigdecimal/math_r/api/numeric/nonzero_p.h +6 -0
  66. data/ext/bigdecimal/math_r/api/numeric/notequal_p.h +6 -0
  67. data/ext/bigdecimal/math_r/api/numeric/numeric_p.h +5 -0
  68. data/ext/bigdecimal/math_r/api/numeric/positive_p.h +6 -0
  69. data/ext/bigdecimal/math_r/api/numeric/real.h +6 -0
  70. data/ext/bigdecimal/math_r/api/numeric/real_p.h +6 -0
  71. data/ext/bigdecimal/math_r/api/numeric/round.h +56 -0
  72. data/ext/bigdecimal/math_r/api/numeric/uminus.h +6 -0
  73. data/ext/bigdecimal/math_r/api/numeric/zero_p.h +6 -0
  74. data/ext/bigdecimal/math_r/api.c +13 -0
  75. data/ext/bigdecimal/math_r/api.h +69 -0
  76. data/ext/bigdecimal/math_r/const.c +186 -0
  77. data/ext/bigdecimal/math_r/decl.h +203 -0
  78. data/ext/bigdecimal/math_r/edf.c +180 -0
  79. data/ext/bigdecimal/math_r/erf.c +80 -0
  80. data/ext/bigdecimal/math_r/euler_f.c +572 -0
  81. data/ext/bigdecimal/math_r/exp.c +72 -0
  82. data/ext/bigdecimal/math_r/extconf.rb +185 -0
  83. data/ext/bigdecimal/math_r/gamma_r.c +251 -0
  84. data/ext/bigdecimal/math_r/hyperb.c +172 -0
  85. data/ext/bigdecimal/math_r/internal/algo/bigmath/E/ser.h +22 -0
  86. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG10/ser.h +16 -0
  87. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG2/BBP2002.h +36 -0
  88. data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG_PI/builtin.h +7 -0
  89. data/ext/bigdecimal/math_r/internal/algo/bigmath/PI/machin.h +48 -0
  90. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT2/builtin.h +5 -0
  91. data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT3/builtin.h +5 -0
  92. data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/branch.h +25 -0
  93. data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/edom.h +15 -0
  94. data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/logrep.h +19 -0
  95. data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/ser.h +34 -0
  96. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/branch.h +19 -0
  97. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/edom.h +17 -0
  98. data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/logrep.h +14 -0
  99. data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/branch.h +16 -0
  100. data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/logrep.h +13 -0
  101. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/branch.h +20 -0
  102. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/edom.h +18 -0
  103. data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/logrep.h +33 -0
  104. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/branch.h +21 -0
  105. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/edom.h +20 -0
  106. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/logrep.h +16 -0
  107. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/branch.h +25 -0
  108. data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/logrep.h +25 -0
  109. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/branch.h +22 -0
  110. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/edom.h +16 -0
  111. data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/logrep.h +21 -0
  112. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/branch.h +18 -0
  113. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/edom.h +19 -0
  114. data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/logrep.h +16 -0
  115. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/branch.h +22 -0
  116. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/edom.h +20 -0
  117. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/logrep.h +15 -0
  118. data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/ser.h +32 -0
  119. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/branch.h +26 -0
  120. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/logrep.h +24 -0
  121. data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/ser.h +48 -0
  122. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/branch.h +16 -0
  123. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/logrep.h +14 -0
  124. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_euler.h +84 -0
  125. data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_usual.h +41 -0
  126. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/branch.h +24 -0
  127. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/edom.h +16 -0
  128. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/logrep.h +16 -0
  129. data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/ser.h +33 -0
  130. data/ext/bigdecimal/math_r/internal/algo/bigmath/cabs/formula.h +8 -0
  131. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/branch.h +38 -0
  132. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/logrep.h +16 -0
  133. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/branch.h +34 -0
  134. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/logrep.h +17 -0
  135. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/branch.h +39 -0
  136. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/logrep.h +17 -0
  137. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/branch.h +29 -0
  138. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/logrep.h +11 -0
  139. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/branch.h +28 -0
  140. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/logrep.h +19 -0
  141. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/branch.h +18 -0
  142. data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/logrep.h +11 -0
  143. data/ext/bigdecimal/math_r/internal/algo/bigmath/carg/formula.h +8 -0
  144. data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/branch.h +29 -0
  145. data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/logrep.h +18 -0
  146. data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/branch.h +38 -0
  147. data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/logrep.h +9 -0
  148. data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/branch.h +35 -0
  149. data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/logrep.h +14 -0
  150. data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/branch.h +59 -0
  151. data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/logrep.h +13 -0
  152. data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/branch.h +46 -0
  153. data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/logrep.h +17 -0
  154. data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/branch.h +26 -0
  155. data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/logrep.h +10 -0
  156. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/formula.h +11 -0
  157. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/branch.h +41 -0
  158. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/eulerf.h +11 -0
  159. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/branch.h +37 -0
  160. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/eulerf.h +11 -0
  161. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/branch.h +46 -0
  162. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/eulerf.h +11 -0
  163. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/branch.h +43 -0
  164. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/eulerf.h +11 -0
  165. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/branch.h +42 -0
  166. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/eulerf.h +11 -0
  167. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/branch.h +38 -0
  168. data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/eulerf.h +11 -0
  169. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/branch.h +42 -0
  170. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/eulerf.h +21 -0
  171. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/branch.h +42 -0
  172. data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/eulerf.h +12 -0
  173. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/branch.h +54 -0
  174. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/formula.h +13 -0
  175. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/formula.h +12 -0
  176. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog1p/branch.h +34 -0
  177. data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/formula.h +12 -0
  178. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/branch.h +21 -0
  179. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/eulerf.h +11 -0
  180. data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/ser.h +12 -0
  181. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/branch.h +22 -0
  182. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/eulerf.h +11 -0
  183. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/formula.h +30 -0
  184. data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/ser.h +11 -0
  185. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/branch.h +28 -0
  186. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/eulerf.h +11 -0
  187. data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/ser.h +12 -0
  188. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/branch.h +23 -0
  189. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/eulerf.h +11 -0
  190. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/formula.h +30 -0
  191. data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/ser.h +13 -0
  192. data/ext/bigdecimal/math_r/internal/algo/bigmath/cpow/formula.h +20 -0
  193. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/branch.h +28 -0
  194. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/eulerf.h +11 -0
  195. data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/ser.h +11 -0
  196. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/branch.h +23 -0
  197. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/eulerf.h +11 -0
  198. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/formula.h +31 -0
  199. data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/ser.h +11 -0
  200. data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/branch.h +42 -0
  201. data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/eulerf.h +11 -0
  202. data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/branch.h +38 -0
  203. data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/eulerf.h +11 -0
  204. data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/branch.h +44 -0
  205. data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/eulerf.h +11 -0
  206. data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/branch.h +41 -0
  207. data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/eulerf.h +11 -0
  208. data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/formula.h +66 -0
  209. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/branch.h +46 -0
  210. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/eulerf.h +11 -0
  211. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/branch.h +43 -0
  212. data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/eulerf.h +11 -0
  213. data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/newton.h +42 -0
  214. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/algo911.h +41 -0
  215. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/branch.h +18 -0
  216. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/cf.h +51 -0
  217. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_inf.h +53 -0
  218. data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_zero.h +45 -0
  219. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/algo911.h +27 -0
  220. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/branch.h +18 -0
  221. data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/cf.h +49 -0
  222. data/ext/bigdecimal/math_r/internal/algo/bigmath/escalb/edf.h +87 -0
  223. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/branch.h +29 -0
  224. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/builtin.h +6 -0
  225. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/edf.h +23 -0
  226. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/branch.h +29 -0
  227. data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/edf.h +19 -0
  228. data/ext/bigdecimal/math_r/internal/algo/bigmath/expxt/edf.h +31 -0
  229. data/ext/bigdecimal/math_r/internal/algo/bigmath/f_euler/formula.h +11 -0
  230. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/branch.h +25 -0
  231. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/l2norm.h +11 -0
  232. data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/mmm.h +38 -0
  233. data/ext/bigdecimal/math_r/internal/algo/bigmath/ipow/edf.h +33 -0
  234. data/ext/bigdecimal/math_r/internal/algo/bigmath/l2norm/formula.h +48 -0
  235. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/branch.h +40 -0
  236. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/builtin.h +12 -0
  237. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edf.h +10 -0
  238. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edom.h +10 -0
  239. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/mercator.h +34 -0
  240. data/ext/bigdecimal/math_r/internal/algo/bigmath/log/ser_okumura.h +57 -0
  241. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/branch.h +40 -0
  242. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/edf.h +11 -0
  243. data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/mercator.h +35 -0
  244. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/branch.h +34 -0
  245. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/p_adic.h +37 -0
  246. data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/ser_mercator.h +35 -0
  247. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/branch.h +40 -0
  248. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/edf.h +11 -0
  249. data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/mercator.h +35 -0
  250. data/ext/bigdecimal/math_r/internal/algo/bigmath/logxt/edf.h +33 -0
  251. data/ext/bigdecimal/math_r/internal/algo/bigmath/pow/formula.h +30 -0
  252. data/ext/bigdecimal/math_r/internal/algo/bigmath/quadrant/formula.h +352 -0
  253. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm10/edf.h +34 -0
  254. data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm2/edf.h +34 -0
  255. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/branch.h +27 -0
  256. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/eulerf.h +11 -0
  257. data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/ser.h +11 -0
  258. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/branch.h +21 -0
  259. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/eulerf.h +11 -0
  260. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/formula.h +25 -0
  261. data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/ser.h +11 -0
  262. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/branch.h +23 -0
  263. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/eulerf.h +11 -0
  264. data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/ser.h +13 -0
  265. data/ext/bigdecimal/math_r/internal/algo/bigmath/sincos/ser.h +50 -0
  266. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/branch.h +23 -0
  267. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/eulerf.h +11 -0
  268. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/formula.h +26 -0
  269. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/ser.h +11 -0
  270. data/ext/bigdecimal/math_r/internal/algo/bigmath/sinhcosh/ser.h +70 -0
  271. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/branch.h +16 -0
  272. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/builtin.h +12 -0
  273. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/edom.h +9 -0
  274. data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/newton.h +36 -0
  275. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/branch.h +26 -0
  276. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/eulerf.h +11 -0
  277. data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/ser.h +18 -0
  278. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/branch.h +23 -0
  279. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/eulerf.h +11 -0
  280. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/formula.h +27 -0
  281. data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/ser.h +14 -0
  282. data/ext/bigdecimal/math_r/internal/algo/bigmath/trig/f_euler.h +290 -0
  283. data/ext/bigdecimal/math_r/log.c +256 -0
  284. data/ext/bigdecimal/math_r/logrep.c +537 -0
  285. data/ext/bigdecimal/math_r/math_r/bigdecimal.h +30 -0
  286. data/ext/bigdecimal/math_r/math_r/bigmath.h +61 -0
  287. data/ext/bigdecimal/math_r/math_r/bigmath_r.h +9 -0
  288. data/ext/bigdecimal/math_r/math_r/ext_extern.h +18 -0
  289. data/ext/bigdecimal/math_r/math_r/globals.h +71 -0
  290. data/ext/bigdecimal/math_r/math_r/numdiff.h +18 -0
  291. data/ext/bigdecimal/math_r/math_r/numeric.h +63 -0
  292. data/ext/bigdecimal/math_r/math_r.c +130 -0
  293. data/ext/bigdecimal/math_r/nucomp.c +158 -0
  294. data/ext/bigdecimal/math_r/overrides.c +91 -0
  295. data/ext/bigdecimal/math_r/power.c +207 -0
  296. data/ext/bigdecimal/math_r/solver.c +1516 -0
  297. data/ext/bigdecimal/math_r/trig.c +205 -0
  298. data/lib/bigdecimal/math_r/const/EulerGamma_engel.rb +46 -0
  299. data/lib/bigdecimal/math_r/const/LOG2_bbp2007.rb +39 -0
  300. data/lib/bigdecimal/math_r/const/PI_chudnovsky.rb +59 -0
  301. data/lib/bigdecimal/math_r/const/PI_euler.rb +40 -0
  302. data/lib/bigdecimal/math_r/const/PI_ramanujan1.rb +45 -0
  303. data/lib/bigdecimal/math_r/const/PI_ramanujan2.rb +46 -0
  304. data/lib/bigdecimal/math_r/const/b053977/b053977.txt +306 -0
  305. data/lib/bigdecimal/math_r/version.rb +7 -0
  306. data/lib/bigdecimal/math_r.rb +12 -0
  307. data/lib/bigdecimal/math_r.so +0 -0
  308. data/sig/bigdecimal/math_r.rbs +6 -0
  309. metadata +393 -0
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mkmf'
4
+
5
+ ARG1 = {"x"=>"VALUE", "prec"=>"VALUE"}
6
+ ARG2 = {"x"=>"VALUE", "y"=>"VALUE", "prec"=>"VALUE"}
7
+ ARG1SCALAR2 = {"x"=>"VALUE", "prec"=>"VALUE", "*a"=>"VALUE", "*b"=>"VALUE"}
8
+ ARG2SCALAR2 = {"x"=>"VALUE", "y"=>"VALUE", "prec"=>"VALUE", "*a"=>"VALUE", "*b"=>"VALUE"}
9
+ ARG_RCM = {"x"=>"VALUE", "*reso"=>"VALUE"}
10
+ ARG_TRIG = {"func"=>"ID", "theta"=>"VALUE", "prec"=>"VALUE"}
11
+ ARG_PREC = {"prec"=>"VALUE"}
12
+
13
+ VALUE = "VALUE"
14
+ VOID = "void"
15
+
16
+ MATHFUNCS = {
17
+ "exp" => [VALUE, ARG1], "cexp" => [VALUE, ARG1],
18
+ "exp2" => [VALUE, ARG1], "cexp2" => [VALUE, ARG1],
19
+ "expxt" => [VALUE, ARG2],
20
+ "log" => [VALUE, ARG1], "clog" => [VALUE, ARG1],
21
+ "log1p" => [VALUE, ARG1], "clog1p" => [VALUE, ARG1],
22
+ "log2" => [VALUE, ARG1], "clog2" => [VALUE, ARG1],
23
+ "log10" => [VALUE, ARG1], "clog10" => [VALUE, ARG1],
24
+ "logxt" => [VALUE, ARG2],
25
+ "rcm2" => [VALUE, ARG_RCM], "rcm10" => [VALUE, ARG_RCM],
26
+ "sincos" => [VOID, ARG1SCALAR2],
27
+ "sin" => [VALUE, ARG1], "csin" => [VALUE, ARG1],
28
+ "cos" => [VALUE, ARG1], "ccos" => [VALUE, ARG1],
29
+ "tan" => [VALUE, ARG1], "ctan" => [VALUE, ARG1],
30
+ "csc" => [VALUE, ARG1], "ccsc" => [VALUE, ARG1],
31
+ "sec" => [VALUE, ARG1], "csec" => [VALUE, ARG1],
32
+ "cot" => [VALUE, ARG1], "ccot" => [VALUE, ARG1],
33
+ "sinhcosh" => [VOID, ARG1SCALAR2],
34
+ "sinh" => [VALUE, ARG1], "csinh" => [VALUE, ARG1],
35
+ "cosh" => [VALUE, ARG1], "ccosh" => [VALUE, ARG1],
36
+ "tanh" => [VALUE, ARG1], "ctanh" => [VALUE, ARG1],
37
+ "csch" => [VALUE, ARG1], "ccsch" => [VALUE, ARG1],
38
+ "sech" => [VALUE, ARG1], "csech" => [VALUE, ARG1],
39
+ "coth" => [VALUE, ARG1], "ccoth" => [VALUE, ARG1],
40
+ "asin" => [VALUE, ARG1], "casin" => [VALUE, ARG1],
41
+ "acos" => [VALUE, ARG1], "cacos" => [VALUE, ARG1],
42
+ "atan" => [VALUE, ARG1], "catan" => [VALUE, ARG1],
43
+ "acsc" => [VALUE, ARG1], "cacsc" => [VALUE, ARG1],
44
+ "asec" => [VALUE, ARG1], "casec" => [VALUE, ARG1],
45
+ "acot" => [VALUE, ARG1], "cacot" => [VALUE, ARG1],
46
+ "asinh" => [VALUE, ARG1], "casinh" => [VALUE, ARG1],
47
+ "acosh" => [VALUE, ARG1], "cacosh" => [VALUE, ARG1],
48
+ "atanh" => [VALUE, ARG1], "catanh" => [VALUE, ARG1],
49
+ "acsch" => [VALUE, ARG1], "cacsch" => [VALUE, ARG1],
50
+ "asech" => [VALUE, ARG1], "casech" => [VALUE, ARG1],
51
+ "acoth" => [VALUE, ARG1], "cacoth" => [VALUE, ARG1],
52
+ "trig" => [VALUE, ARG_TRIG],
53
+ "hypot" => [VALUE, ARG2],
54
+ "sqrt" => [VALUE, ARG1], "csqrt" => [VALUE, ARG1],
55
+ "cuberoot" => [VALUE, ARG1], "ccbrt" => [VALUE, ARG1],
56
+ "pow" => [VALUE, ARG2], "cpow" => [VALUE, ARG2], "ipow" => [VALUE, ARG2],
57
+ "escalb" => [VOID, ARG2SCALAR2],
58
+ "cabs" => [VALUE, ARG1],
59
+ "carg" => [VALUE, ARG1],
60
+ "l2norm" => [VALUE, ARG1],
61
+ "quadrant" => [VALUE, ARG2],
62
+ "erf" => [VALUE, ARG1],
63
+ "erfc" => [VALUE, ARG1],
64
+ "f_euler" => [VALUE, ARG1],
65
+ "PI"=>[VALUE, ARG_PREC],
66
+ "E"=>[VALUE, ARG_PREC],
67
+ "LOG2"=>[VALUE, ARG_PREC],
68
+ "LOG10"=>[VALUE, ARG_PREC],
69
+ "LOG_PI"=>[VALUE, ARG_PREC],
70
+ "SQRT2"=>[VALUE, ARG_PREC],
71
+ "SQRT3"=>[VALUE, ARG_PREC]
72
+ }
73
+
74
+ CB_TYPE = {
75
+ "exp" => "bigmath_func1", "cexp" => "bigmath_func1",
76
+ "exp2" => "bigmath_func1", "cexp2" => "bigmath_func1",
77
+ "log" => "bigmath_func1", "clog" => "bigmath_func1",
78
+ "log2" => "bigmath_func1", "clog2" => "bigmath_func1",
79
+ "log10" => "bigmath_func1", "clog10" => "bigmath_func1",
80
+ "log1p" => "bigmath_func1", "clog1p" => "bigmath_func1",
81
+ "sqrt" => "bigmath_func1",
82
+ "sin" => "bigmath_func1", "csin" => "bigmath_func1",
83
+ "cos" => "bigmath_func1", "ccos" => "bigmath_func1",
84
+ "tan" => "bigmath_func1", "ctan" => "bigmath_func1",
85
+ "csc" => "bigmath_func1", "ccsc" => "bigmath_func1",
86
+ "sec" => "bigmath_func1", "csec" => "bigmath_func1",
87
+ "cot" => "bigmath_func1", "ccot" => "bigmath_func1",
88
+ "sinh" => "bigmath_func1", "csinh" => "bigmath_func1",
89
+ "cosh" => "bigmath_func1", "ccosh" => "bigmath_func1",
90
+ "tanh" => "bigmath_func1", "ctanh" => "bigmath_func1",
91
+ "csch" => "bigmath_func1", "ccsch" => "bigmath_func1",
92
+ "sech" => "bigmath_func1", "csech" => "bigmath_func1",
93
+ "coth" => "bigmath_func1", "ccoth" => "bigmath_func1",
94
+ "asin" => "bigmath_func1", "casin" => "bigmath_func1",
95
+ "acos" => "bigmath_func1", "cacos" => "bigmath_func1",
96
+ "atan" => "bigmath_func1", "catan" => "bigmath_func1",
97
+ "acsc" => "bigmath_func1", "cacsc" => "bigmath_func1",
98
+ "asec" => "bigmath_func1", "casec" => "bigmath_func1",
99
+ "acot" => "bigmath_func1", "cacot" => "bigmath_func1",
100
+ "asinh" => "bigmath_func1", "casinh" => "bigmath_func1",
101
+ "acosh" => "bigmath_func1", "cacosh" => "bigmath_func1",
102
+ "atanh" => "bigmath_func1", "catanh" => "bigmath_func1",
103
+ "acsch" => "bigmath_func1", "cacsch" => "bigmath_func1",
104
+ "asech" => "bigmath_func1", "casech" => "bigmath_func1",
105
+ "acoth" => "bigmath_func1", "cacoth" => "bigmath_func1",
106
+ "hypot" => "bigmath_func2",
107
+ "erf" => "bigmath_func1",
108
+ "erfc" => "bigmath_func1"
109
+ }
110
+
111
+ API_H = 'api.h'
112
+ DECL_H = "decl.h"
113
+ ALGOFUNC_H = 'algofunc.h'
114
+
115
+ MATHFUNC_DIR_PATH = "internal/algo/bigmath/*/**/*.h"
116
+ BRANCH_DIR_PATH = "internal/algo/branch/*/**/*.h"
117
+ API_DIR_PATH = "api/*/**/*.h"
118
+
119
+ DECL_INCLG = "BIGMATH_MATHFUNC_H"
120
+
121
+ def declare_func(retval_type, funcname, args)
122
+ ary = args.map{|(arg, type)| [type, arg].join(" ")}.join(", ")
123
+ "%s %s(%s);" % [retval_type, funcname, ary]
124
+ end
125
+
126
+ def cfile_writer(filename, str)
127
+ f = IO.read(filename)
128
+ if f != str
129
+ IO.write(filename, str)
130
+ end
131
+ end
132
+
133
+ def update_header(include_guard, header_filename, target_dir)
134
+ header_str = String.new
135
+ Dir.chdir(__dir__) do
136
+ header_str << "#ifndef #{include_guard}\n"
137
+ header_str << "#define #{include_guard}\n"
138
+ header_str << "\n"
139
+ Dir.glob(target_dir) do |h|
140
+ header_str << "#include \"#{h}\"\n"
141
+ end
142
+ header_str << "\n"
143
+ header_str << "#endif /* #{include_guard} */\n"
144
+ cfile_writer(header_filename, header_str)
145
+ end
146
+ end
147
+
148
+ def update_decl_mathfunc_header
149
+ header_filename = DECL_H
150
+ header_str = String.new
151
+ Dir.chdir(__dir__) do
152
+ header_str << "#ifndef #{DECL_INCLG}\n"
153
+ header_str << "#define #{DECL_INCLG}\n"
154
+ header_str << "\n"
155
+ Dir.glob(MATHFUNC_DIR_PATH) do |h|
156
+ if /\w+\/\w+\/\w+\/\w+\/\w+.h/.match?(h)
157
+ /(.+)\/(.+)\/(.+)\/(.+)\/(.+).h/ =~ h
158
+ mathfunc, algo = $4, $5
159
+ if MATHFUNCS.keys.include?(mathfunc)
160
+ retval_type, args = MATHFUNCS[mathfunc]
161
+ if algo == "branch"
162
+ if CB_TYPE.keys.include?(mathfunc)
163
+ args = args.merge({"cb" => CB_TYPE[mathfunc]})
164
+ else
165
+ raise "The callback function name is not in the list: #{mathfunc}"
166
+ end
167
+ end
168
+ header_str << declare_func(retval_type, "#{mathfunc}_#{algo}", args)
169
+ header_str << "\n"
170
+ else
171
+ raise "The function name is not in the list: #{mathfunc}"
172
+ end
173
+ end
174
+ end
175
+ header_str << "\n"
176
+ header_str << "#endif /* #{DECL_INCLG} */"
177
+ cfile_writer(header_filename, header_str)
178
+ end
179
+ end
180
+
181
+ update_header("BIGMATH_ALGOFUNC_H", ALGOFUNC_H, MATHFUNC_DIR_PATH)
182
+ update_header("BIGMATH_API_H", API_H, API_DIR_PATH)
183
+ update_decl_mathfunc_header
184
+
185
+ create_makefile('bigdecimal/math_r/math_r')
@@ -0,0 +1,251 @@
1
+ /*******************************************************************************
2
+ gamma_r.c -- Regularized Incomplete Gamma Function
3
+
4
+ Author: tribusonz
5
+ Lisence: MIT
6
+ *******************************************************************************/
7
+ #include <ruby.h>
8
+ #include "math_r/globals.h"
9
+ #include "math_r/bigmath_r.h"
10
+ #include "decl.h"
11
+
12
+ #if 0
13
+ VALUE gammar_q(VALUE, VALUE, VALUE, VALUE);
14
+
15
+
16
+ VALUE
17
+ gammar_p(VALUE a, VALUE x, VALUE loggamma_a, VALUE prec)
18
+ {
19
+ const ID add = rb_intern("add");
20
+ const ID geq = rb_intern(">=");
21
+ VALUE zero = BIG_ZERO, one = BIG_ONE, result, term, previous, big_k;
22
+ VALUE n;
23
+ a = rb_num_canonicalize(a, prec, ARG_REAL, ARG_RAWVALUE);
24
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
25
+ loggamma_a = rb_num_canonicalize(loggamma_a, prec, ARG_REAL, ARG_RAWVALUE);
26
+
27
+ if (RTEST(rb_num_coerce_cmp(x, rb_funcall1(one, '+', a), geq)))
28
+ return rb_funcall1(one, '-', gammar_q(a, x, loggamma_a, prec));
29
+
30
+ if (rb_num_zero_p(x))
31
+ return zero;
32
+
33
+ n = rb_numdiff_make_n(prec);
34
+
35
+ // result = term = exp(a * log(x, n) - x - loggamma_a, n) / a;
36
+ term = rb_funcall1(a, '*', rb_bigmath_log(x, n));
37
+ term = rb_funcall1(term, '-', x);
38
+ term = rb_funcall1(term, '-', loggamma_a);
39
+ term = rb_bigmath_exp(term, n);
40
+ term = rb_funcall1(term, '/', a);
41
+ result = term;
42
+
43
+ big_k = one;
44
+
45
+ for (int k = 1; k <= 1000; k++)
46
+ {
47
+ VALUE d = rb_funcall1(x, '/', rb_funcall1(a, '+', big_k));
48
+ term = rb_funcall1(term, '*', d);
49
+ previous = result; result = rb_funcall(result, add, 2, term, n);
50
+ if (rb_num_equal_p(result, previous))
51
+ goto retval;
52
+ big_k = rb_funcall1(big_k, '+', one);
53
+ }
54
+ rb_warn("gammar_p(): can't converge.");
55
+ retval:
56
+ RB_GC_GUARD(a);
57
+ RB_GC_GUARD(x);
58
+ RB_GC_GUARD(loggamma_a);
59
+ RB_GC_GUARD(zero);
60
+ RB_GC_GUARD(one);
61
+ RB_GC_GUARD(result);
62
+ RB_GC_GUARD(term);
63
+ RB_GC_GUARD(previous);
64
+ return result;
65
+ }
66
+
67
+ VALUE
68
+ gammar_q(VALUE a, VALUE x, VALUE loggamma_a, VALUE prec)
69
+ {
70
+ const ID add = rb_intern("add");
71
+ const ID div = rb_intern("div");
72
+ VALUE one = BIG_ONE, two = rb_BigDecimal1(INT2FIX(2)),
73
+ big_k, la, lb, w, result, temp, previous;
74
+ VALUE n;
75
+ a = rb_num_canonicalize(a, prec, ARG_REAL, ARG_RAWVALUE);
76
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
77
+ loggamma_a = rb_num_canonicalize(loggamma_a, prec, ARG_REAL, ARG_RAWVALUE);
78
+
79
+ if (RTEST(rb_num_coerce_cmp(x, rb_funcall1(one, '+', a), '<')))
80
+ return rb_funcall1(one, '-', gammar_p(a, x, loggamma_a, prec));
81
+
82
+ n = rb_numdiff_make_n(prec);
83
+ la = one; lb = rb_funcall1(one, '+', rb_funcall1(x, '-', a)); // Laguerreの多項式
84
+ // w = exp(a * log(x, prec) - x - loggamma_a, n);
85
+ w = rb_funcall1(a, '*', rb_bigmath_log(x, prec));
86
+ w = rb_funcall1(w, '-', x);
87
+ w = rb_funcall1(w, '-', loggamma_a);
88
+ w = rb_bigmath_exp(w, prec);
89
+ result = rb_funcall1(w, '/', lb);
90
+ big_k = two;
91
+ for (int k = 2; k <= 1000; k++)
92
+ {
93
+ // temp = ((k - one - a) * (lb - la) + (k + x) * lb).div(k, n);
94
+ temp = rb_funcall1(k, '-', rb_funcall1(one, '-', a));
95
+ temp = rb_funcall1(temp, '*', rb_funcall1(lb, '-', la));
96
+ temp = rb_funcall1(temp, '+', rb_funcall1(rb_funcall1(k, '+', x), '*', lb));
97
+ temp = rb_funcall(temp, div, 2, big_k, n);
98
+
99
+ la = lb; lb = temp;
100
+ // w *= (k - one - a) / k;
101
+ temp = rb_funcall1(rb_funcall1(big_k, '-', one), '-', a);
102
+ w = rb_funcall1(w, '*', rb_funcall1(temp, '/', big_k));
103
+
104
+ // temp = w / (la * lb);
105
+ temp = rb_funcall1(w, '/', rb_funcall1(la, '*', lb));
106
+
107
+ previous = result; result = rb_funcall(result, add, 2, temp, n);
108
+ if (rb_num_equal_p(result, previous))
109
+ goto retval;
110
+ big_k = rb_funcall1(big_k, '+', one);
111
+ }
112
+ rb_warn("gammar_q(): can't converge.");
113
+ retval:
114
+ RB_GC_GUARD(a);
115
+ RB_GC_GUARD(x);
116
+ RB_GC_GUARD(loggamma_a);
117
+ RB_GC_GUARD(one);
118
+ RB_GC_GUARD(two);
119
+ RB_GC_GUARD(big_k);
120
+ RB_GC_GUARD(la);
121
+ RB_GC_GUARD(lb);
122
+ RB_GC_GUARD(w);
123
+ RB_GC_GUARD(result);
124
+ RB_GC_GUARD(temp);
125
+ RB_GC_GUARD(previous);
126
+ return result;
127
+ }
128
+
129
+ // TODO: -1 <= x <= 1 以外はエラーが出る: `erf': undefined method `-' for nil (NoMethodError)
130
+ VALUE
131
+ erf_gammar(VALUE x, VALUE prec)
132
+ {
133
+ const ID div = rb_intern("div");
134
+ VALUE half = rb_BigDecimal1(rb_str_new_cstr("0.5"));
135
+ VALUE two = rb_BigDecimal1(INT2FIX(2));
136
+ VALUE log_pi_2 = rb_funcall(
137
+ rb_bigmath_const_log_pi(prec), div, 2, two, prec);
138
+ VALUE y = gammar_p(half, rb_funcall1(x, '*', x), log_pi_2, prec);
139
+ if (rb_num_negative_p(x)) y = rb_num_uminus(y);
140
+ return rb_num_round(y, prec);
141
+ }
142
+
143
+ VALUE
144
+ erf_branch(VALUE x, VALUE prec, bigmath_func1 erf_cb)
145
+ {
146
+ VALUE y = Qundef;
147
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
148
+ if (erf_cb == NULL)
149
+ return BIG_NAN;
150
+ if (!rb_num_finite_p(x))
151
+ {
152
+ if (rb_num_nan_p(x))
153
+ y = BIG_NAN;
154
+ else
155
+ {
156
+ switch (rb_num_infinite_p(x)) {
157
+ case -1:
158
+ y = BIG_MINUS_ONE;
159
+ break;
160
+ case 1:
161
+ y = BIG_ONE;
162
+ break;
163
+ }
164
+ }
165
+ }
166
+ if (y == Qundef)
167
+ y = erf_cb(x, prec);
168
+ return y;
169
+ }
170
+
171
+ // TODO: -1 <= x <= 1 以外はエラーが出る: `erf': undefined method `-' for nil (NoMethodError)
172
+ VALUE
173
+ erfc_gammar(VALUE x, VALUE prec)
174
+ {
175
+ const ID div = rb_intern("div");
176
+ VALUE half = rb_BigDecimal1(rb_str_new_cstr("0.5"));
177
+ VALUE two = rb_BigDecimal1(INT2FIX(2));
178
+ VALUE log_pi_2 = rb_funcall(
179
+ rb_bigmath_const_log_pi(prec), div, 2, two, prec);
180
+ VALUE y;
181
+ if (!rb_num_negative_p(x))
182
+ y = gammar_q(half, rb_funcall1(x, '*', x), log_pi_2, prec);
183
+ else
184
+ {
185
+ y = gammar_p(half, rb_funcall1(x, '*', x), log_pi_2, prec);
186
+ y = rb_funcall1(BIG_ONE, '+', y);
187
+ }
188
+ return rb_num_round(y, prec);
189
+ }
190
+
191
+ VALUE
192
+ erfc_branch(VALUE x, VALUE prec, bigmath_func1 erfc_cb)
193
+ {
194
+ VALUE y = Qundef;
195
+ x = rb_num_canonicalize(x, prec, ARG_REAL, ARG_RAWVALUE);
196
+ if (erfc_cb == NULL)
197
+ return BIG_NAN;
198
+ if (!rb_num_finite_p(x))
199
+ {
200
+ if (rb_num_nan_p(x))
201
+ y = BIG_NAN;
202
+ else
203
+ {
204
+ switch (rb_num_infinite_p(x)) {
205
+ case -1:
206
+ y = rb_BigDecimal1(INT2FIX(2));
207
+ break;
208
+ case 1:
209
+ y = BIG_ZERO;
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ if (y == Qundef)
215
+ y = erfc_cb(x, prec);
216
+ return y;
217
+ }
218
+
219
+
220
+
221
+
222
+ static VALUE
223
+ __impl_gammar_erf(VALUE unused_obj, VALUE x, VALUE prec)
224
+ {
225
+ return erf_branch(x, prec, erf_gammar);
226
+ }
227
+
228
+
229
+ static VALUE
230
+ __impl_gammar_erfc(VALUE unused_obj, VALUE x, VALUE prec)
231
+ {
232
+ return erfc_branch(x, prec, erfc_gammar);
233
+ }
234
+
235
+
236
+ // TODO: eps-16の誤差がある。
237
+ // |erf(1) - 0.84270079294971474562456763838456194738845892814039e0|
238
+ // 結果: 1.237166529966980473119076080698259... × 10^-16
239
+ // |erfc(1) - 0.15729920705028525437543236161543805261154107185961e0|
240
+ // 結果: 1.2371665299669804731190760806982591... × 10^-16
241
+
242
+ #endif
243
+
244
+ void
245
+ InitVM_GammaR(void)
246
+ {
247
+ #if 0
248
+ rb_define_module_function(rb_mGammaR, "erf", __impl_gammar_erf, 2);
249
+ rb_define_module_function(rb_mGammaR, "erfc", __impl_gammar_erfc, 2);
250
+ #endif
251
+ }
@@ -0,0 +1,172 @@
1
+ /*******************************************************************************
2
+ hyperb.c -- Hyperbolic functions
3
+
4
+ Author: tribusonz
5
+ Licence: MIT
6
+ *******************************************************************************/
7
+ #include <ruby.h>
8
+ #include "math_r/globals.h"
9
+ #include "math_r/bigmath_r.h"
10
+ #include "decl.h"
11
+
12
+ /**
13
+ * Computes hyperbolic sine of +x+.
14
+ *
15
+ * @example
16
+ * BigMathR::Hyperb.sinh(1, 20) # Series expansion
17
+ * #=> 0.11752011936438014569e1
18
+ * BigMathR::Hyperb.sinh(4, 20) # Formula
19
+ * #=> 0.27289917197127752449e2
20
+ * @param x [Numeric] Numerical argument
21
+ * @param prec [Integer] Arbitrary precision
22
+ * @return [BigDecimal] Real solution
23
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
24
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
25
+ * @since 0.1.0
26
+ */
27
+ static VALUE
28
+ __impl_hyperb_sinh(VALUE unused_obj, VALUE x, VALUE prec)
29
+ {
30
+ return sinh_branch(x, prec, sinh_formula);
31
+ }
32
+
33
+
34
+ /**
35
+ * Computes hyperbolic cosine of +x+.
36
+ *
37
+ * @example
38
+ * BigMathR::Hyperb.cosh(1, 20) # Series expansion
39
+ * #=> 0.15430806348152437785e1
40
+ * BigMathR::Hyperb.cosh(4, 20) # Formula
41
+ * #=> 0.27308232836016486629e2
42
+
43
+ * @param x [Numeric] Numerical argument
44
+ * @param prec [Integer] Arbitrary precision
45
+ * @return [BigDecimal] Real solution
46
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
47
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
48
+ * @since 0.1.0
49
+ */
50
+ static VALUE
51
+ __impl_hyperb_cosh(VALUE unused_obj, VALUE x, VALUE prec)
52
+ {
53
+ return cosh_branch(x, prec, cosh_formula);
54
+ }
55
+
56
+ /**
57
+ * Computes hyperbolic tangent of +x+.
58
+ *
59
+ * @example
60
+ * BigMathR::Hyperb.tanh(1, 20) # Series expansion
61
+ * #=> 0.76159415595576488812e0
62
+ * BigMathR::Hyperb.tanh(4, 20) # Formula
63
+ * #=> 0.99932929973906704379e0
64
+ * @param x [Numeric] Numerical argument
65
+ * @param prec [Integer] Arbitrary precision
66
+ * @return [BigDecimal] Real solution
67
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
68
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
69
+ * @since 0.1.0
70
+ */
71
+ static VALUE
72
+ __impl_hyperb_tanh(VALUE unused_obj, VALUE x, VALUE prec)
73
+ {
74
+ return tanh_branch(x, prec, tanh_formula);
75
+ }
76
+
77
+ /**
78
+ * Computes hyperbolic cosecant of +x+.
79
+ *
80
+ * @example
81
+ * BigMathR::Hyperb.csch(1, 20) # Series expansion
82
+ * #=> 0.85091812823932154512e0
83
+ * BigMathR::Hyperb.csch(4, 20) # Formula
84
+ * #=> 0.36643570325865605966e-1
85
+ * @param x [Numeric] Numerical argument
86
+ * @param prec [Integer] Arbitrary precision
87
+ * @return [BigDecimal] Real solution
88
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
89
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
90
+ * @since 0.1.0
91
+ */
92
+ static VALUE
93
+ __impl_hyperb_csch(VALUE unused_obj, VALUE x, VALUE prec)
94
+ {
95
+ return csch_branch(x, prec, csch_formula);
96
+ }
97
+
98
+ /**
99
+ * Computes hyperbolic secant of +x+.
100
+ *
101
+ * @example
102
+ * BigMathR::Hyperb.sech(1, 20) # Series expansion
103
+ * #=> 0.64805427366388539957e0
104
+ * BigMathR::Hyperb.sech(4, 20) # Formula
105
+ * #=> 0.36618993473686532773e-1
106
+ * @param x [Numeric] Numerical argument
107
+ * @param prec [Integer] Arbitrary precision
108
+ * @return [BigDecimal] Real solution
109
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
110
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
111
+ * @since 0.1.0
112
+ */
113
+ static VALUE
114
+ __impl_hyperb_sech(VALUE unused_obj, VALUE x, VALUE prec)
115
+ {
116
+ return sech_branch(x, prec, sech_formula);
117
+ }
118
+
119
+ /**
120
+ * Computes hyperbolic cotangent of +x+.
121
+ *
122
+ * @example
123
+ * BigMathR::Hyperb.coth(1, 20) # Series expansion
124
+ * #=> 0.13130352854993313036e1
125
+ * BigMathR::Hyperb.coth(4, 20) # Formula
126
+ * #=> 0.10006711504016824899e1
127
+ * @param x [Numeric] Numerical argument
128
+ * @param prec [Integer] Arbitrary precision
129
+ * @return [BigDecimal] Real solution
130
+ * @raise [ArgumentError] Occurs when +prec+ is not a positive integer.
131
+ * @raise [TypeError] Occurs when +x+ is not a numeric class.
132
+ * @since 0.1.0
133
+ */
134
+ static VALUE
135
+ __impl_hyperb_coth(VALUE unused_obj, VALUE x, VALUE prec)
136
+ {
137
+ return coth_branch(x, prec, coth_formula);
138
+ }
139
+
140
+ /**
141
+ * Document-module: BigMathR::Hyperb
142
+ *
143
+ * A module that provides a hyperbolic functions.
144
+ * It is used internally.
145
+ * <br>
146
+ * It handle the real number solutions.
147
+ * The algorithm is implemented according to the references,
148
+ * when |x| < 3 computes to series expansion, otherwise computes by exponent identity.
149
+ * == Synopsis
150
+ * The function names defined are the same as those in the C/C++ standard.
151
+ * <br>
152
+ * - Hyperbolic Sine: +:sinh+ <br>
153
+ * - Hyperbolic Cosine: +:cosh+ <br>
154
+ * - Hyperbolic Tangent: +:tanh+ <br>
155
+ * Follow, those reciprocals of not defined in C/C++ standard.
156
+ * <br>
157
+ * - Hyperbolic Cosecant: +:csch+ <br>
158
+ * - Hyperbolic Secant: +:sech+ <br>
159
+ * - Hyperbolic Cotangent: +:coth+ <br>
160
+ * Reference::
161
+ * C-gengo ni yoru hyoujun alkgorithm jiten (Japanese) - Hasruhiko Okumura (Gijutsu hyouron-sha)
162
+ */
163
+ void
164
+ InitVM_Hyperb(void)
165
+ {
166
+ rb_define_singleton_method(rb_mHyperb, "sinh", __impl_hyperb_sinh, 2);
167
+ rb_define_singleton_method(rb_mHyperb, "cosh", __impl_hyperb_cosh, 2);
168
+ rb_define_singleton_method(rb_mHyperb, "tanh", __impl_hyperb_tanh, 2);
169
+ rb_define_singleton_method(rb_mHyperb, "csch", __impl_hyperb_csch, 2);
170
+ rb_define_singleton_method(rb_mHyperb, "sech", __impl_hyperb_sech, 2);
171
+ rb_define_singleton_method(rb_mHyperb, "coth", __impl_hyperb_coth, 2);
172
+ }
@@ -0,0 +1,22 @@
1
+ VALUE
2
+ E_ser(VALUE prec)
3
+ {
4
+ const ID div = rb_intern("div");
5
+ VALUE n, m, a, e;
6
+ long k = 0; // TODO: should be break when number is exceeded to LONG_MAX?
7
+
8
+ rb_check_precise(prec);
9
+ n = rb_numdiff_make_n(prec);
10
+
11
+ a = BIG_ONE;
12
+ e = BIG_ZERO;
13
+
14
+ while (rb_numdiff_condition_p(e, a, n, &m))
15
+ {
16
+ e = rb_funcall1(e, '+', a);
17
+ a = rb_funcall(a, div, 2, LONG2NUM(++k), m);
18
+ }
19
+ RB_GC_GUARD(a);
20
+ RB_GC_GUARD(e);
21
+ return rb_num_round(e, prec);
22
+ }
@@ -0,0 +1,16 @@
1
+ VALUE
2
+ LOG10_ser(VALUE prec)
3
+ {
4
+ #if 0
5
+ VALUE x = rb_Rational(INT2FIX(-9), INT2FIX(10));
6
+ x = log_ser_mercator(x, prec);
7
+ return rb_num_uminus(x);
8
+ #else
9
+ const ID add = rb_intern("add");
10
+ VALUE x = rb_Rational(INT2FIX(1), INT2FIX(4)), log2;
11
+ x = log1p_p_adic(x, prec);
12
+ log2 = LOG2_BBP2002(prec);
13
+ return rb_funcall(rb_funcall1(log2, '*', INT2FIX(3)), add, 2, x, prec);
14
+ #endif
15
+ }
16
+
@@ -0,0 +1,36 @@
1
+ VALUE
2
+ LOG2_BBP2002(VALUE prec)
3
+ {
4
+ const ID mult = rb_intern("mult");
5
+ const ID div = rb_intern("div");
6
+ VALUE two, nine, a, r, s, d, n, m;
7
+
8
+ rb_check_precise(prec);
9
+ n = rb_numdiff_make_n(prec);
10
+
11
+ two = rb_BigDecimal1(INT2FIX(2));
12
+ nine = rb_BigDecimal1(INT2FIX(9));
13
+ a = BIG_ONE;
14
+ r = BIG_ONE;
15
+ s = BIG_ZERO;
16
+ d = BIG_ONE;
17
+
18
+ while (rb_numdiff_condition_p(s, d, n, &m))
19
+ {
20
+ d = rb_funcall(r, div, 2, a, m);
21
+ s = rb_funcall1(s, '+', d);
22
+ a = rb_funcall1(a, '+', two);
23
+ r = rb_funcall(r, div, 2, nine, m);
24
+ }
25
+ s = rb_funcall(s, mult, 2,
26
+ rb_Rational(INT2FIX(2), INT2FIX(3)), prec);
27
+
28
+ RB_GC_GUARD(two);
29
+ RB_GC_GUARD(nine);
30
+ RB_GC_GUARD(d);
31
+ RB_GC_GUARD(a);
32
+ RB_GC_GUARD(r);
33
+ RB_GC_GUARD(s);
34
+
35
+ return s;
36
+ }
@@ -0,0 +1,7 @@
1
+ VALUE
2
+ LOG_PI_builtin(VALUE prec)
3
+ {
4
+ VALUE log_pi = rb_bigmath_const_pi(prec);
5
+ return log_builtin(log_pi, prec);
6
+ }
7
+