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.
- checksums.yaml +7 -0
- data/.ruby-version +1 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE +21 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +13 -0
- data/changelog.md +24 -0
- data/ext/bigdecimal/math_r/algofunc.h +203 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/check_precise.h +12 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/infinity.h +6 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/minus_infinity.h +5 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/minus_one.h +6 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/minus_zero.h +6 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/nan.h +6 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/one.h +6 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/sign.h +10 -0
- data/ext/bigdecimal/math_r/api/bigdecimal/zero.h +6 -0
- data/ext/bigdecimal/math_r/api/bigmath/api_call1.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/api_call2.h +6 -0
- data/ext/bigdecimal/math_r/api/bigmath/atan.h +7 -0
- data/ext/bigdecimal/math_r/api/bigmath/atan_adopt.h +42 -0
- data/ext/bigdecimal/math_r/api/bigmath/cabs.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/carg.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/cexp.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/clog.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const.h +39 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_e.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_log10.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_log2.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_log_pi.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_pi.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_sqrt2.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/const_sqrt3.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/cpow.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/csqrt.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/degree_sparg.h +199 -0
- data/ext/bigdecimal/math_r/api/bigmath/escalb.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/exp.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/expxt.h +18 -0
- data/ext/bigdecimal/math_r/api/bigmath/hypot.h +10 -0
- data/ext/bigdecimal/math_r/api/bigmath/ipow.h +14 -0
- data/ext/bigdecimal/math_r/api/bigmath/l2norm.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/log.h +7 -0
- data/ext/bigdecimal/math_r/api/bigmath/pow.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/quadrant.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/sincos.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/sqrt.h +5 -0
- data/ext/bigdecimal/math_r/api/bigmath/to_rad.h +41 -0
- data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal.h +6 -0
- data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal1.h +6 -0
- data/ext/bigdecimal/math_r/api/kernel/rb_BigDecimal_flo.h +9 -0
- data/ext/bigdecimal/math_r/api/kernel/rb_ImaginaryZ.h +8 -0
- data/ext/bigdecimal/math_r/api/numanalysis/condition_p.h +26 -0
- data/ext/bigdecimal/math_r/api/numanalysis/make_n.h +9 -0
- data/ext/bigdecimal/math_r/api/numeric/abs.h +7 -0
- data/ext/bigdecimal/math_r/api/numeric/canonicalize.h +140 -0
- data/ext/bigdecimal/math_r/api/numeric/cmpeql.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/equal_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/finite_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/imag.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/infinite_p.h +7 -0
- data/ext/bigdecimal/math_r/api/numeric/nan_p.h +5 -0
- data/ext/bigdecimal/math_r/api/numeric/negative_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/nonzero_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/notequal_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/numeric_p.h +5 -0
- data/ext/bigdecimal/math_r/api/numeric/positive_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/real.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/real_p.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/round.h +56 -0
- data/ext/bigdecimal/math_r/api/numeric/uminus.h +6 -0
- data/ext/bigdecimal/math_r/api/numeric/zero_p.h +6 -0
- data/ext/bigdecimal/math_r/api.c +13 -0
- data/ext/bigdecimal/math_r/api.h +69 -0
- data/ext/bigdecimal/math_r/const.c +186 -0
- data/ext/bigdecimal/math_r/decl.h +203 -0
- data/ext/bigdecimal/math_r/edf.c +180 -0
- data/ext/bigdecimal/math_r/erf.c +80 -0
- data/ext/bigdecimal/math_r/euler_f.c +572 -0
- data/ext/bigdecimal/math_r/exp.c +72 -0
- data/ext/bigdecimal/math_r/extconf.rb +185 -0
- data/ext/bigdecimal/math_r/gamma_r.c +251 -0
- data/ext/bigdecimal/math_r/hyperb.c +172 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/E/ser.h +22 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG10/ser.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG2/BBP2002.h +36 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/LOG_PI/builtin.h +7 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/PI/machin.h +48 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT2/builtin.h +5 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/SQRT3/builtin.h +5 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/branch.h +25 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/edom.h +15 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/logrep.h +19 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acos/ser.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/branch.h +19 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/edom.h +17 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acosh/logrep.h +14 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/branch.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acot/logrep.h +13 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/branch.h +20 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/edom.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acoth/logrep.h +33 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/branch.h +21 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/edom.h +20 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acsc/logrep.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/branch.h +25 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/acsch/logrep.h +25 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/branch.h +22 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/edom.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asec/logrep.h +21 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/branch.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/edom.h +19 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asech/logrep.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/branch.h +22 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/edom.h +20 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/logrep.h +15 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asin/ser.h +32 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/branch.h +26 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/logrep.h +24 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/asinh/ser.h +48 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/branch.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/logrep.h +14 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_euler.h +84 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atan/ser_usual.h +41 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/branch.h +24 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/edom.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/logrep.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/atanh/ser.h +33 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cabs/formula.h +8 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/branch.h +38 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacos/logrep.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/branch.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacosh/logrep.h +17 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/branch.h +39 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacot/logrep.h +17 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/branch.h +29 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacoth/logrep.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/branch.h +28 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsc/logrep.h +19 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/branch.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cacsch/logrep.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/carg/formula.h +8 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/branch.h +29 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casec/logrep.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/branch.h +38 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casech/logrep.h +9 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/branch.h +35 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casin/logrep.h +14 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/branch.h +59 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/casinh/logrep.h +13 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/branch.h +46 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/catan/logrep.h +17 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/branch.h +26 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/catanh/logrep.h +10 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccbrt/formula.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/branch.h +41 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccos/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/branch.h +37 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccosh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/branch.h +46 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccot/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/branch.h +43 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccoth/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/branch.h +42 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsc/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/branch.h +38 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ccsch/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/branch.h +42 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp/eulerf.h +21 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/branch.h +42 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cexp2/eulerf.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/branch.h +54 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/clog/formula.h +13 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/clog10/formula.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/clog1p/branch.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/clog2/formula.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/branch.h +21 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cos/ser.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/branch.h +22 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/formula.h +30 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cosh/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/branch.h +28 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cot/ser.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/branch.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/formula.h +30 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/coth/ser.h +13 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cpow/formula.h +20 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/branch.h +28 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csc/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/branch.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/formula.h +31 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csch/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/branch.h +42 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csec/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/branch.h +38 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csech/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/branch.h +44 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csin/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/branch.h +41 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csinh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/csqrt/formula.h +66 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/branch.h +46 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ctan/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/branch.h +43 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ctanh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/cuberoot/newton.h +42 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/algo911.h +41 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/branch.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/cf.h +51 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_inf.h +53 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erf/ser_zero.h +45 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/algo911.h +27 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/branch.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/erfc/cf.h +49 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/escalb/edf.h +87 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/branch.h +29 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/builtin.h +6 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/exp/edf.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/branch.h +29 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/exp2/edf.h +19 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/expxt/edf.h +31 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/f_euler/formula.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/branch.h +25 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/l2norm.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/hypot/mmm.h +38 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/ipow/edf.h +33 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/l2norm/formula.h +48 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/branch.h +40 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/builtin.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edf.h +10 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/edom.h +10 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/mercator.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log/ser_okumura.h +57 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/branch.h +40 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/edf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log10/mercator.h +35 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/branch.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/p_adic.h +37 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log1p/ser_mercator.h +35 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/branch.h +40 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/edf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/log2/mercator.h +35 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/logxt/edf.h +33 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/pow/formula.h +30 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/quadrant/formula.h +352 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm10/edf.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/rcm2/edf.h +34 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/branch.h +27 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sec/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/branch.h +21 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/formula.h +25 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sech/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/branch.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sin/ser.h +13 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sincos/ser.h +50 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/branch.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/formula.h +26 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sinh/ser.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sinhcosh/ser.h +70 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/branch.h +16 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/builtin.h +12 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/edom.h +9 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/sqrt/newton.h +36 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/branch.h +26 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tan/ser.h +18 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/branch.h +23 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/eulerf.h +11 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/formula.h +27 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/tanh/ser.h +14 -0
- data/ext/bigdecimal/math_r/internal/algo/bigmath/trig/f_euler.h +290 -0
- data/ext/bigdecimal/math_r/log.c +256 -0
- data/ext/bigdecimal/math_r/logrep.c +537 -0
- data/ext/bigdecimal/math_r/math_r/bigdecimal.h +30 -0
- data/ext/bigdecimal/math_r/math_r/bigmath.h +61 -0
- data/ext/bigdecimal/math_r/math_r/bigmath_r.h +9 -0
- data/ext/bigdecimal/math_r/math_r/ext_extern.h +18 -0
- data/ext/bigdecimal/math_r/math_r/globals.h +71 -0
- data/ext/bigdecimal/math_r/math_r/numdiff.h +18 -0
- data/ext/bigdecimal/math_r/math_r/numeric.h +63 -0
- data/ext/bigdecimal/math_r/math_r.c +130 -0
- data/ext/bigdecimal/math_r/nucomp.c +158 -0
- data/ext/bigdecimal/math_r/overrides.c +91 -0
- data/ext/bigdecimal/math_r/power.c +207 -0
- data/ext/bigdecimal/math_r/solver.c +1516 -0
- data/ext/bigdecimal/math_r/trig.c +205 -0
- data/lib/bigdecimal/math_r/const/EulerGamma_engel.rb +46 -0
- data/lib/bigdecimal/math_r/const/LOG2_bbp2007.rb +39 -0
- data/lib/bigdecimal/math_r/const/PI_chudnovsky.rb +59 -0
- data/lib/bigdecimal/math_r/const/PI_euler.rb +40 -0
- data/lib/bigdecimal/math_r/const/PI_ramanujan1.rb +45 -0
- data/lib/bigdecimal/math_r/const/PI_ramanujan2.rb +46 -0
- data/lib/bigdecimal/math_r/const/b053977/b053977.txt +306 -0
- data/lib/bigdecimal/math_r/version.rb +7 -0
- data/lib/bigdecimal/math_r.rb +12 -0
- data/lib/bigdecimal/math_r.so +0 -0
- data/sig/bigdecimal/math_r.rbs +6 -0
- 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
|
+
}
|