Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)
|
#include "bigdecimal.h"
#include "ruby/util.h"
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <math.h>
Go to the source code of this file.
Macros | |
#define | NDEBUG |
#define | MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, min, max) |
#define | SIGNED_VALUE_MAX INTPTR_MAX |
#define | SIGNED_VALUE_MIN INTPTR_MIN |
#define | MUL_OVERFLOW_SIGNED_VALUE_P(a, b) MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, SIGNED_VALUE_MIN, SIGNED_VALUE_MAX) |
#define | ENTER(n) volatile VALUE RB_UNUSED_VAR(vStack[n]);int iStack=0 |
#define | PUSH(x) (vStack[iStack++] = (VALUE)(x)) |
#define | SAVE(p) PUSH((p)->obj) |
#define | GUARD_OBJ(p, y) ((p)=(y), SAVE(p)) |
#define | BASE_FIG RMPD_COMPONENT_FIGURES |
#define | BASE RMPD_BASE |
#define | HALF_BASE (BASE/2) |
#define | BASE1 (BASE/10) |
#define | DBLE_FIG rmpd_double_figures() /* figure of double */ |
#define | RRATIONAL_ZERO_P(x) |
#define | RRATIONAL_NEGATIVE_P(x) RTEST(rb_funcall((x), '<', 1, INT2FIX(0))) |
#define | RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) |
#define | RB_OBJ_STRING(obj) (obj) |
#define | BIGDECIMAL_POSITIVE_P(bd) ((bd)->sign > 0) |
#define | BIGDECIMAL_NEGATIVE_P(bd) ((bd)->sign < 0) |
#define | DoSomeOne(x, y, f) rb_num_coerce_bin(x,y,f) |
#define | VpAllocReal(prec) (Real *)VpMemAlloc(offsetof(Real, frac) + (prec) * sizeof(BDIGIT)) |
#define | VpReallocReal(ptr, prec) (Real *)VpMemRealloc((ptr), offsetof(Real, frac) + (prec) * sizeof(BDIGIT)) |
#define | BigMath_exp(x, n) BigMath_s_exp(rb_mBigMath, (x), (n)) |
#define | BigMath_log(x, n) BigMath_s_log(rb_mBigMath, (x), (n)) |
#define | is_positive(x) (!is_negative(x)) |
#define | maxnr 100UL /* Maximum iterations for calculating sqrt. */ |
#define | MemCmp(x, y, z) memcmp(x,y,z) |
#define | StrCmp(x, y) strcmp(x,y) |
#define | rmpd_set_thread_local_exception_mode(mode) |
#define | rmpd_set_thread_local_precision_limit(limit) |
#define | RMPD_PRECISION_LIMIT_DEFAULT ((size_t)0) |
#define | rmpd_set_thread_local_rounding_mode(mode) |
Enumerations | |
enum | op_sw { OP_SW_ADD = 1 , OP_SW_SUB , OP_SW_MULT , OP_SW_DIV } |
Variables | |
VALUE | rb_cBigDecimal |
VALUE | rb_mBigMath |
volatile const double | gOne_ABCED9B4_CE73__00400511F31D = 1.0 |
#define BASE RMPD_BASE |
Definition at line 74 of file bigdecimal.c.
#define BASE1 (BASE/10) |
Definition at line 77 of file bigdecimal.c.
#define BASE_FIG RMPD_COMPONENT_FIGURES |
Definition at line 73 of file bigdecimal.c.
#define BIGDECIMAL_NEGATIVE_P | ( | bd | ) | ((bd)->sign < 0) |
Definition at line 155 of file bigdecimal.c.
#define BIGDECIMAL_POSITIVE_P | ( | bd | ) | ((bd)->sign > 0) |
Definition at line 154 of file bigdecimal.c.
#define BigMath_exp | ( | x, | |
n | |||
) | BigMath_s_exp(rb_mBigMath, (x), (n)) |
Definition at line 2307 of file bigdecimal.c.
#define BigMath_log | ( | x, | |
n | |||
) | BigMath_s_log(rb_mBigMath, (x), (n)) |
Definition at line 2308 of file bigdecimal.c.
#define DBLE_FIG rmpd_double_figures() /* figure of double */ |
Definition at line 80 of file bigdecimal.c.
#define DoSomeOne | ( | x, | |
y, | |||
f | |||
) | rb_num_coerce_bin(x,y,f) |
Definition at line 160 of file bigdecimal.c.
#define ENTER | ( | n | ) | volatile VALUE RB_UNUSED_VAR(vStack[n]);int iStack=0 |
Definition at line 68 of file bigdecimal.c.
#define GUARD_OBJ | ( | p, | |
y | |||
) | ((p)=(y), SAVE(p)) |
Definition at line 71 of file bigdecimal.c.
#define HALF_BASE (BASE/2) |
Definition at line 76 of file bigdecimal.c.
#define is_positive | ( | x | ) | (!is_negative(x)) |
Definition at line 2331 of file bigdecimal.c.
#define maxnr 100UL /* Maximum iterations for calculating sqrt. */ |
Definition at line 3705 of file bigdecimal.c.
#define MemCmp | ( | x, | |
y, | |||
z | |||
) | memcmp(x,y,z) |
Definition at line 3709 of file bigdecimal.c.
#define MUL_OVERFLOW_SIGNED_INTEGER_P | ( | a, | |
b, | |||
min, | |||
max | |||
) |
Definition at line 35 of file bigdecimal.c.
#define MUL_OVERFLOW_SIGNED_VALUE_P | ( | a, | |
b | |||
) | MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, SIGNED_VALUE_MIN, SIGNED_VALUE_MAX) |
Definition at line 43 of file bigdecimal.c.
#define NDEBUG |
Definition at line 18 of file bigdecimal.c.
#define PUSH | ( | x | ) | (vStack[iStack++] = (VALUE)(x)) |
Definition at line 69 of file bigdecimal.c.
#define RB_OBJ_CLASSNAME | ( | obj | ) | rb_obj_class(obj) |
Definition at line 98 of file bigdecimal.c.
#define RB_OBJ_STRING | ( | obj | ) | (obj) |
Definition at line 99 of file bigdecimal.c.
#define RMPD_PRECISION_LIMIT_DEFAULT ((size_t)0) |
Definition at line 3821 of file bigdecimal.c.
#define rmpd_set_thread_local_exception_mode | ( | mode | ) |
Definition at line 3782 of file bigdecimal.c.
#define rmpd_set_thread_local_precision_limit | ( | limit | ) |
Definition at line 3815 of file bigdecimal.c.
#define rmpd_set_thread_local_rounding_mode | ( | mode | ) |
Definition at line 3852 of file bigdecimal.c.
#define RRATIONAL_NEGATIVE_P | ( | x | ) | RTEST(rb_funcall((x), '<', 1, INT2FIX(0))) |
Definition at line 89 of file bigdecimal.c.
#define RRATIONAL_ZERO_P | ( | x | ) |
Definition at line 84 of file bigdecimal.c.
#define SAVE | ( | p | ) | PUSH((p)->obj) |
Definition at line 70 of file bigdecimal.c.
#define SIGNED_VALUE_MAX INTPTR_MAX |
Definition at line 41 of file bigdecimal.c.
#define SIGNED_VALUE_MIN INTPTR_MIN |
Definition at line 42 of file bigdecimal.c.
#define StrCmp | ( | x, | |
y | |||
) | strcmp(x,y) |
Definition at line 3710 of file bigdecimal.c.
#define VpAllocReal | ( | prec | ) | (Real *)VpMemAlloc(offsetof(Real, frac) + (prec) * sizeof(BDIGIT)) |
Definition at line 788 of file bigdecimal.c.
#define VpReallocReal | ( | ptr, | |
prec | |||
) | (Real *)VpMemRealloc((ptr), offsetof(Real, frac) + (prec) * sizeof(BDIGIT)) |
Definition at line 789 of file bigdecimal.c.
enum op_sw |
Enumerator | |
---|---|
OP_SW_ADD | |
OP_SW_SUB | |
OP_SW_MULT | |
OP_SW_DIV |
Definition at line 3712 of file bigdecimal.c.
void Init_bigdecimal | ( | void | ) |
Definition at line 3456 of file bigdecimal.c.
References CLASS_OF, id_ceil, id_eq, id_to_r, INT2FIX, rb_cBigDecimal, rb_cNumeric, rb_define_class(), rb_define_const(), rb_define_global_function, rb_define_method, rb_define_module(), rb_define_singleton_method, rb_ext_ractor_safe(), rb_mBigMath, rb_str_new2, rb_undef_alloc_func(), rb_undef_method(), SIGNED_VALUE, VP_EXCEPTION_ALL, VP_EXCEPTION_INFINITY, VP_EXCEPTION_NaN, VP_EXCEPTION_OVERFLOW, VP_EXCEPTION_UNDERFLOW, VP_EXCEPTION_ZERODIVIDE, VP_ROUND_CEIL, VP_ROUND_DOWN, VP_ROUND_FLOOR, VP_ROUND_HALF_DOWN, VP_ROUND_HALF_EVEN, VP_ROUND_HALF_UP, VP_ROUND_MODE, VP_ROUND_UP, VP_SIGN_NaN, VP_SIGN_NEGATIVE_FINITE, VP_SIGN_NEGATIVE_INFINITE, VP_SIGN_NEGATIVE_ZERO, VP_SIGN_POSITIVE_FINITE, VP_SIGN_POSITIVE_INFINITE, VP_SIGN_POSITIVE_ZERO, VpBaseVal, and VpInit().
Definition at line 4213 of file bigdecimal.c.
References ISSPACE, len, Real::MaxPrec, NULL, str, SZ_INF, SZ_NaN, SZ_NINF, SZ_PINF, UNREACHABLE, VP_SIGN_NaN, VP_SIGN_NEGATIVE_INFINITE, VP_SIGN_POSITIVE_INFINITE, VpAllocReal, VpSetNaN, VpSetNegInf, and VpSetPosInf.
Referenced by VpAlloc().
Definition at line 6466 of file bigdecimal.c.
References f, VpAsgn(), and VpMidRound().
Definition at line 4549 of file bigdecimal.c.
References BASE_FIG, BDIGIT, Real::exponent, Real::frac, Min, OP_SW_ADD, OP_SW_SUB, Real::Prec, VpAsgn(), VpGetSign, VpIsZero, VpSetSign, and VpSetZero.
Referenced by VpSqrt().
Definition at line 4272 of file bigdecimal.c.
References BASE_FIG, ISDIGIT, ISSPACE, Max, Real::MaxPrec, ne, NULL, PRIsVALUE, rb_eArgError, rb_raise(), rb_str_new2, rb_str_resize(), rb_str_tmp_new(), rmpd_parse_special_string(), RSTRING_PTR, str, strlen(), VpAllocReal, VpCtoV(), VpGetPrecLimit(), and VpSetZero.
Referenced by VpInit(), VpMult(), VpNewRbClass(), VpPower(), and VpSqrt().
Definition at line 4505 of file bigdecimal.c.
References BASE_FIG, BDIGIT, Real::exponent, Real::frac, Real::MaxPrec, memcpy, Real::Prec, VpGetSign, VpIsInf, VpIsNaN, VpIsZero, VpSetInf, VpSetNaN, VpSetSign, and VpSetZero.
Referenced by VpActiveRound(), VpAddSub(), VpDivd(), VpFrac(), VpMult(), VpPower(), and VpSqrt().
Definition at line 5386 of file bigdecimal.c.
References Real::exponent, Real::frac, Real::Prec, Real::sign, VpGetSign, VpIsDef, VpIsNaN, and VpIsZero.
Definition at line 783 of file bigdecimal.c.
References rb_cBigDecimal, str, and VpNewRbClass().
VP_EXPORT int VpCtoV | ( | Real * | a, |
const char * | int_chr, | ||
size_t | ni, | ||
const char * | frac, | ||
size_t | nf, | ||
const char * | exp_chr, | ||
size_t | ne | ||
) |
Definition at line 5824 of file bigdecimal.c.
References BASE_FIG, BDIGIT, Real::exponent, Real::frac, Real::MaxPrec, MUL_OVERFLOW_SIGNED_VALUE_P, ne, Real::Prec, rb_warn(), SIGNED_VALUE, SIGNED_VALUE_MAX, VP_EXCEPTION_INFINITY, VpException(), VpSetInf, VpSetSign, and VpSetZero.
Referenced by VpAlloc().
Definition at line 5133 of file bigdecimal.c.
References BASE, BASE_FIG, BDIGIT, BDIGIT_DBL, Real::exponent, Real::frac, if(), Real::MaxPrec, Min, OP_SW_DIV, Real::Prec, PRIuSIZE, rb_bug(), VP_EXCEPTION_NaN, VP_EXCEPTION_ZERODIVIDE, VpAsgn(), VpException(), VpGetSign, VpIsOne, VpIsZero, VpSetInf, VpSetNaN, VpSetSign, and VpSetZero.
Definition at line 6048 of file bigdecimal.c.
References BASE, BDIGIT, Real::exponent, Real::frac, isinf(), isnan, Real::MaxPrec, ne, Real::Prec, SIGNED_VALUE, VpSetNaN, VpSetNegInf, VpSetPosInf, VpSetSign, and VpSetZero.
Referenced by VpSqrt().
Definition at line 3970 of file bigdecimal.c.
References f, rb_eFloatDomainError, rb_fatal(), rb_raise(), str, VP_EXCEPTION_INFINITY, VP_EXCEPTION_MEMORY, VP_EXCEPTION_NaN, VP_EXCEPTION_OP, VP_EXCEPTION_UNDERFLOW, and VP_EXCEPTION_ZERODIVIDE.
Referenced by VpCtoV(), VpDivd(), VpMemAlloc(), VpMemRealloc(), and VpSqrt().
Definition at line 5611 of file bigdecimal.c.
References BASE1, BASE_FIG, Real::exponent, Real::frac, and VpHasVal.
Definition at line 6561 of file bigdecimal.c.
References Real::exponent, Real::frac, Real::MaxPrec, Min, Real::Prec, VpAsgn(), VpGetSign, VpHasVal, VpSetSign, and VpSetZero.
VP_EXPORT double VpGetDoubleNaN | ( | void | ) |
VP_EXPORT double VpGetDoubleNegInf | ( | void | ) |
Definition at line 3947 of file bigdecimal.c.
References HUGE_VAL.
Referenced by VpGetDoubleNegZero(), and VpVtoD().
VP_EXPORT double VpGetDoubleNegZero | ( | void | ) |
Definition at line 3953 of file bigdecimal.c.
References VpGetDoubleNegInf().
VP_EXPORT double VpGetDoublePosInf | ( | void | ) |
VP_EXPORT size_t VpGetPrecLimit | ( | void | ) |
Definition at line 3825 of file bigdecimal.c.
References NIL_P, NUM2SIZET, rb_thread_current(), rb_thread_local_aref(), RMPD_PRECISION_LIMIT_DEFAULT, and rmpd_set_thread_local_precision_limit.
Referenced by VpAlloc(), and VpSetPrecLimit().
VP_EXPORT unsigned short VpGetRoundMode | ( | void | ) |
Definition at line 3860 of file bigdecimal.c.
References NIL_P, NUM2USHORT, rb_thread_current(), rb_thread_local_aref(), RMPD_ROUNDING_MODE_DEFAULT, and rmpd_set_thread_local_rounding_mode.
Referenced by VpSetRoundMode().
Definition at line 4141 of file bigdecimal.c.
References BASE, BASE1, BASE_FIG, DBLE_FIG, HALF_BASE, PRIuBDIGIT, VpAlloc(), and VpGetDoubleNegZero().
Referenced by Init_bigdecimal().
Definition at line 3876 of file bigdecimal.c.
References VP_ROUND_CEIL, VP_ROUND_DOWN, VP_ROUND_FLOOR, VP_ROUND_HALF_DOWN, VP_ROUND_HALF_EVEN, VP_ROUND_HALF_UP, and VP_ROUND_UP.
Referenced by VpSetRoundMode().
Definition at line 6451 of file bigdecimal.c.
References BASE_FIG, BDIGIT, f, Real::frac, VpExponent, VpHasVal, and VpMidRound().
VP_EXPORT void * VpMemAlloc | ( | size_t | mb | ) |
Definition at line 3736 of file bigdecimal.c.
References VP_EXCEPTION_MEMORY, VpException(), and xmalloc.
VP_EXPORT void * VpMemRealloc | ( | void * | ptr, |
size_t | mb | ||
) |
Definition at line 3750 of file bigdecimal.c.
References ptr, VP_EXCEPTION_MEMORY, VpException(), and xrealloc.
Definition at line 6289 of file bigdecimal.c.
References BASE, BASE_FIG, BDIGIT, BIGDECIMAL_NEGATIVE_P, BIGDECIMAL_POSITIVE_P, div, Real::exponent, f, Real::frac, Real::Prec, SIGNED_VALUE, VP_ROUND_CEIL, VP_ROUND_DOWN, VP_ROUND_FLOOR, VP_ROUND_HALF_DOWN, VP_ROUND_HALF_EVEN, VP_ROUND_HALF_UP, VP_ROUND_UP, VpGetSign, VpSetOne, VpSetSign, and VpSetZero.
Referenced by VpActiveRound(), and VpLeftRound().
Definition at line 5004 of file bigdecimal.c.
References BASE, BASE_FIG, BDIGIT, BDIGIT_DBL, Real::exponent, Real::frac, Real::MaxPrec, NULL, OP_SW_MULT, Real::Prec, VpAlloc(), VpAsgn(), VpFree(), VpGetSign, VpIsOne, VpIsZero, VpSetSign, and VpSetZero.
Definition at line 772 of file bigdecimal.c.
References Real::obj, RB_OBJ_FREEZE, RTYPEDDATA_DATA, str, TypedData_Wrap_Struct, and VpAlloc().
Referenced by VpCreateRbObject().
Definition at line 4097 of file bigdecimal.c.
References BASE_FIG, Real::exponent, NULL, Real::Prec, SIGNED_VALUE, and VpIsDef.
Definition at line 4169 of file bigdecimal.c.
VP_EXPORT int VpPower | ( | Real * | y, |
Real * | x, | ||
SIGNED_VALUE | n | ||
) |
Definition at line 6609 of file bigdecimal.c.
References BASE_FIG, BIGDECIMAL_POSITIVE_P, Real::exponent, Real::frac, Real::MaxPrec, NULL, Real::Prec, PRIdVALUE, SIGNED_VALUE, VpAlloc(), VpAsgn(), VpDivd(), VpFree(), VpGetSign, VpIsInf, VpIsNaN, VpIsPosInf, VpIsZero, VpMult(), VpSetInf, VpSetNaN, VpSetOne, VpSetSign, and VpSetZero.
VP_EXPORT size_t VpSetPrecLimit | ( | size_t | n | ) |
Definition at line 3841 of file bigdecimal.c.
References rmpd_set_thread_local_precision_limit, and VpGetPrecLimit().
VP_EXPORT unsigned short VpSetRoundMode | ( | unsigned short | n | ) |
Definition at line 3894 of file bigdecimal.c.
References rmpd_set_thread_local_rounding_mode, VpGetRoundMode(), and VpIsRoundMode().
Definition at line 6180 of file bigdecimal.c.
References BASE, BASE_FIG, BIGDECIMAL_NEGATIVE_P, DBLE_FIG, Real::exponent, f, if(), maxnr, Real::MaxPrec, Min, NULL, PRIdSIZE, SIGNED_VALUE, VP_EXCEPTION_OP, VpAddSub(), VpAlloc(), VpAsgn(), VpChangeSign, VpDivd(), VpDtoV(), VpException(), VpFree(), VpIsNaN, VpIsOne, VpIsPosInf, VpIsZero, VpMult(), VpSetNaN, VpSetOne, and VpVtoD().
Definition at line 5628 of file bigdecimal.c.
References BASE1, BDIGIT_DBL, BIGDECIMAL_NEGATIVE_P, Real::frac, Real::Prec, strlen(), SZ_INF, SZ_NaN, SZ_NINF, VpIsNaN, VpIsNegInf, VpIsPosInf, VpIsPosZero, and VpIsZero.
Definition at line 5758 of file bigdecimal.c.
References BASE, BASE1, BASE_FIG, BDIGIT, BIGDECIMAL_NEGATIVE_P, Real::exponent, Real::frac, Real::Prec, strlen(), and VpToSpecialString().
Definition at line 5675 of file bigdecimal.c.
References SZ_INF, SZ_NaN, SZ_NINF, VpIsNaN, VpIsNegInf, VpIsPosInf, VpIsPosZero, and VpIsZero.
Referenced by VpToFString(), and VpToString().
Definition at line 5710 of file bigdecimal.c.
References BASE1, BASE_FIG, BDIGIT, BIGDECIMAL_NEGATIVE_P, Real::exponent, Real::frac, Real::Prec, PRIdSIZE, strlen(), and VpToSpecialString().
VP_EXPORT int VpVtoD | ( | double * | d, |
SIGNED_VALUE * | e, | ||
Real * | m | ||
) |
Definition at line 5984 of file bigdecimal.c.
References BASE, BASE_FIG, DBLE_FIG, div, Real::exponent, f, Real::frac, Min, Real::Prec, SIGNED_VALUE, VpGetDoubleNaN(), VpGetDoubleNegInf(), VpGetDoubleNegZero(), VpGetDoublePosInf(), VpGetSign, VpIsNaN, VpIsNegInf, VpIsNegZero, VpIsPosInf, and VpIsPosZero.
Referenced by VpSqrt().
volatile const double gOne_ABCED9B4_CE73__00400511F31D = 1.0 |
Definition at line 3912 of file bigdecimal.c.
VALUE rb_cBigDecimal |
Definition at line 45 of file bigdecimal.c.
Referenced by Init_bigdecimal(), and VpCreateRbObject().
VALUE rb_mBigMath |
Definition at line 46 of file bigdecimal.c.
Referenced by Init_bigdecimal().