Ruby  2.5.0dev(2017-10-22revision60238)
Macros | Enumerations | Functions | Variables
bigdecimal.c File Reference
#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   (DBL_DIG+1) /* 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 }
 

Functions

 NORETURN (static void cannot_be_coerced_into_BigDecimal(VALUE, VALUE))
 
VP_EXPORT RealVpNewRbClass (size_t mx, const char *str, VALUE klass)
 
VP_EXPORT RealVpCreateRbObject (size_t mx, const char *str)
 
void Init_bigdecimal (void)
 
VP_EXPORT void * VpMemAlloc (size_t mb)
 
VP_EXPORT void * VpMemRealloc (void *ptr, size_t mb)
 
VP_EXPORT void VpFree (Real *pv)
 
VP_EXPORT size_t VpGetPrecLimit (void)
 
VP_EXPORT size_t VpSetPrecLimit (size_t n)
 
VP_EXPORT unsigned short VpGetRoundMode (void)
 
VP_EXPORT int VpIsRoundMode (unsigned short n)
 
VP_EXPORT unsigned short VpSetRoundMode (unsigned short n)
 
VP_EXPORT double VpGetDoubleNaN (void)
 
VP_EXPORT double VpGetDoublePosInf (void)
 
VP_EXPORT double VpGetDoubleNegInf (void)
 
VP_EXPORT double VpGetDoubleNegZero (void)
 
VP_EXPORT int VpException (unsigned short f, const char *str, int always)
 
VP_EXPORT size_t VpNumOfChars (Real *vp, const char *pszFmt)
 
VP_EXPORT size_t VpInit (BDIGIT BaseVal)
 
VP_EXPORT RealVpOne (void)
 
VP_EXPORT RealVpAlloc (size_t mx, const char *szVal)
 
VP_EXPORT size_t VpAsgn (Real *c, Real *a, int isw)
 
VP_EXPORT size_t VpAddSub (Real *c, Real *a, Real *b, int operation)
 
VP_EXPORT size_t VpMult (Real *c, Real *a, Real *b)
 
VP_EXPORT size_t VpDivd (Real *c, Real *r, Real *a, Real *b)
 
VP_EXPORT int VpComp (Real *a, Real *b)
 
VP_EXPORT ssize_t VpExponent10 (Real *a)
 
VP_EXPORT void VpSzMantissa (Real *a, char *psz)
 
VP_EXPORT int VpToSpecialString (Real *a, char *psz, int fPlus)
 
VP_EXPORT void VpToString (Real *a, char *psz, size_t fFmt, int fPlus)
 
VP_EXPORT void VpToFString (Real *a, char *psz, size_t fFmt, int fPlus)
 
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)
 
VP_EXPORT int VpVtoD (double *d, SIGNED_VALUE *e, Real *m)
 
VP_EXPORT void VpDtoV (Real *m, double d)
 
VP_EXPORT int VpSqrt (Real *y, Real *x)
 
VP_EXPORT int VpMidRound (Real *y, unsigned short f, ssize_t nf)
 
VP_EXPORT int VpLeftRound (Real *y, unsigned short f, ssize_t nf)
 
VP_EXPORT int VpActiveRound (Real *y, Real *x, unsigned short f, ssize_t nf)
 
VP_EXPORT void VpFrac (Real *y, Real *x)
 
VP_EXPORT int VpPower (Real *y, Real *x, SIGNED_VALUE n)
 

Variables

VALUE rb_cBigDecimal
 
VALUE rb_mBigMath
 
volatile const double gZero_ABCED9B1_CE73__00400511F31D = 0.0
 
volatile const double gOne_ABCED9B4_CE73__00400511F31D = 1.0
 

Macro Definition Documentation

◆ BASE

#define BASE   RMPD_BASE

Definition at line 74 of file bigdecimal.c.

Referenced by VpDtoV(), VpInit(), VpMidRound(), VpPower(), VpSqrt(), VpToFString(), and VpVtoD().

◆ BASE1

#define BASE1   (BASE/10)

Definition at line 77 of file bigdecimal.c.

Referenced by VpComp(), VpExponent10(), VpInit(), VpSzMantissa(), and VpToFString().

◆ BASE_FIG

#define BASE_FIG   RMPD_COMPONENT_FIGURES

◆ BIGDECIMAL_NEGATIVE_P

#define BIGDECIMAL_NEGATIVE_P (   bd)    ((bd)->sign < 0)

Definition at line 131 of file bigdecimal.c.

Referenced by VpComp(), VpMidRound(), VpSqrt(), VpSzMantissa(), and VpToFString().

◆ BIGDECIMAL_POSITIVE_P

#define BIGDECIMAL_POSITIVE_P (   bd)    ((bd)->sign > 0)

Definition at line 130 of file bigdecimal.c.

Referenced by VpMidRound(), and VpPower().

◆ BigMath_exp

#define BigMath_exp (   x,
 
)    BigMath_s_exp(rb_mBigMath, (x), (n))

Definition at line 2189 of file bigdecimal.c.

◆ BigMath_log

#define BigMath_log (   x,
 
)    BigMath_s_log(rb_mBigMath, (x), (n))

Definition at line 2190 of file bigdecimal.c.

◆ DBLE_FIG

#define DBLE_FIG   (DBL_DIG+1) /* figure of double */

Definition at line 80 of file bigdecimal.c.

Referenced by VpInit(), VpSqrt(), and VpVtoD().

◆ DoSomeOne

#define DoSomeOne (   x,
  y,
  f 
)    rb_num_coerce_bin(x,y,f)

Definition at line 136 of file bigdecimal.c.

◆ ENTER

#define ENTER (   n)    volatile VALUE RB_UNUSED_VAR(vStack[n]);int iStack=0

Definition at line 68 of file bigdecimal.c.

◆ GUARD_OBJ

#define GUARD_OBJ (   p,
 
)    ((p)=(y), SAVE(p))

Definition at line 71 of file bigdecimal.c.

◆ HALF_BASE

#define HALF_BASE   (BASE/2)

Definition at line 76 of file bigdecimal.c.

Referenced by VpInit().

◆ is_positive

#define is_positive (   x)    (!is_negative(x))

Definition at line 2213 of file bigdecimal.c.

◆ maxnr

#define maxnr   100UL /* Maximum iterations for calculating sqrt. */

Definition at line 3481 of file bigdecimal.c.

Referenced by VpSqrt().

◆ MemCmp

#define MemCmp (   x,
  y,
 
)    memcmp(x,y,z)

Definition at line 3485 of file bigdecimal.c.

◆ MUL_OVERFLOW_SIGNED_INTEGER_P

#define MUL_OVERFLOW_SIGNED_INTEGER_P (   a,
  b,
  min,
  max 
)
Value:
( \
(a) == 0 ? 0 : \
(a) == -1 ? (b) < -(max) : \
(a) > 0 ? \
((b) > 0 ? (max) / (a) < (b) : (min) / (a) > (b)) : \
((b) > 0 ? (min) / (a) < (b) : (max) / (a) > (b)))

Definition at line 35 of file bigdecimal.c.

◆ MUL_OVERFLOW_SIGNED_VALUE_P

#define MUL_OVERFLOW_SIGNED_VALUE_P (   a,
 
)    MUL_OVERFLOW_SIGNED_INTEGER_P(a, b, SIGNED_VALUE_MIN, SIGNED_VALUE_MAX)

Definition at line 43 of file bigdecimal.c.

◆ NDEBUG

#define NDEBUG

Definition at line 17 of file bigdecimal.c.

◆ PUSH

#define PUSH (   x)    (vStack[iStack++] = (VALUE)(x))

Definition at line 69 of file bigdecimal.c.

◆ RB_OBJ_CLASSNAME

#define RB_OBJ_CLASSNAME (   obj)    rb_obj_class(obj)

Definition at line 98 of file bigdecimal.c.

◆ RB_OBJ_STRING

#define RB_OBJ_STRING (   obj)    (obj)

Definition at line 99 of file bigdecimal.c.

◆ RMPD_PRECISION_LIMIT_DEFAULT

#define RMPD_PRECISION_LIMIT_DEFAULT   ((size_t)0)

Definition at line 3594 of file bigdecimal.c.

◆ rmpd_set_thread_local_exception_mode

#define rmpd_set_thread_local_exception_mode (   mode)
Value:
id_BigDecimal_exception_mode, \
INT2FIX((int)(mode)) \
)
VALUE rb_thread_current(void)
Definition: thread.c:2494
VALUE rb_thread_local_aset(VALUE, ID, VALUE)
Definition: thread.c:3148
#define INT2FIX(i)
Definition: ruby.h:232

Definition at line 3555 of file bigdecimal.c.

◆ rmpd_set_thread_local_precision_limit

#define rmpd_set_thread_local_precision_limit (   limit)
Value:
id_BigDecimal_precision_limit, \
SIZET2NUM(limit) \
)
VALUE rb_thread_current(void)
Definition: thread.c:2494
VALUE rb_thread_local_aset(VALUE, ID, VALUE)
Definition: thread.c:3148
#define SIZET2NUM(v)
Definition: ruby.h:264

Definition at line 3588 of file bigdecimal.c.

Referenced by VpSetPrecLimit().

◆ rmpd_set_thread_local_rounding_mode

#define rmpd_set_thread_local_rounding_mode (   mode)
Value:
id_BigDecimal_rounding_mode, \
INT2FIX((int)(mode)) \
)
VALUE rb_thread_current(void)
Definition: thread.c:2494
VALUE rb_thread_local_aset(VALUE, ID, VALUE)
Definition: thread.c:3148
#define INT2FIX(i)
Definition: ruby.h:232

Definition at line 3625 of file bigdecimal.c.

Referenced by VpSetRoundMode().

◆ RRATIONAL_NEGATIVE_P

#define RRATIONAL_NEGATIVE_P (   x)    RTEST(rb_funcall((x), '<', 1, INT2FIX(0)))

Definition at line 89 of file bigdecimal.c.

◆ RRATIONAL_ZERO_P

#define RRATIONAL_ZERO_P (   x)
Value:
(FIXNUM_P(rb_rational_num(x)) && \
FIX2LONG(rb_rational_num(x)) == 0)
#define FIXNUM_P(f)
Definition: ruby.h:365

Definition at line 84 of file bigdecimal.c.

◆ SAVE

#define SAVE (   p)    PUSH((p)->obj)

Definition at line 70 of file bigdecimal.c.

◆ SIGNED_VALUE_MAX

#define SIGNED_VALUE_MAX   INTPTR_MAX

Definition at line 41 of file bigdecimal.c.

◆ SIGNED_VALUE_MIN

#define SIGNED_VALUE_MIN   INTPTR_MIN

Definition at line 42 of file bigdecimal.c.

◆ StrCmp

#define StrCmp (   x,
 
)    strcmp(x,y)

Definition at line 3486 of file bigdecimal.c.

Referenced by VpAlloc().

◆ VpAllocReal

#define VpAllocReal (   prec)    (Real *)VpMemAlloc(offsetof(Real, frac) + (prec) * sizeof(BDIGIT))

Definition at line 675 of file bigdecimal.c.

Referenced by VpAlloc().

◆ VpReallocReal

#define VpReallocReal (   ptr,
  prec 
)    (Real *)VpMemRealloc((ptr), offsetof(Real, frac) + (prec) * sizeof(BDIGIT))

Definition at line 676 of file bigdecimal.c.

Enumeration Type Documentation

◆ op_sw

enum op_sw
Enumerator
OP_SW_ADD 
OP_SW_SUB 
OP_SW_MULT 
OP_SW_DIV 

Definition at line 3488 of file bigdecimal.c.

Function Documentation

◆ Init_bigdecimal()

void Init_bigdecimal ( void  )

Definition at line 3245 of file bigdecimal.c.

◆ NORETURN()

NORETURN ( static void   cannot_be_coerced_into_BigDecimalVALUE, VALUE)

◆ VpActiveRound()

VP_EXPORT int VpActiveRound ( Real y,
Real x,
unsigned short  f,
ssize_t  nf 
)

Definition at line 6141 of file bigdecimal.c.

References VpAsgn(), and VpMidRound().

◆ VpAddSub()

VP_EXPORT size_t VpAddSub ( Real c,
Real a,
Real b,
int  operation 
)

Definition at line 4224 of file bigdecimal.c.

References BDIGIT.

Referenced by VpSqrt().

◆ VpAlloc()

VP_EXPORT Real* VpAlloc ( size_t  mx,
const char *  szVal 
)

◆ VpAsgn()

VP_EXPORT size_t VpAsgn ( Real c,
Real a,
int  isw 
)

◆ VpComp()

VP_EXPORT int VpComp ( Real a,
Real b 
)

◆ VpCreateRbObject()

VP_EXPORT Real* VpCreateRbObject ( size_t  mx,
const char *  str 
)

Definition at line 670 of file bigdecimal.c.

References rb_cBigDecimal, and VpNewRbClass().

◆ VpCtoV()

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 5499 of file bigdecimal.c.

Referenced by VpAlloc().

◆ VpDivd()

VP_EXPORT size_t VpDivd ( Real c,
Real r,
Real a,
Real b 
)

Definition at line 4808 of file bigdecimal.c.

References BDIGIT, BDIGIT_DBL, and VpSetNaN.

Referenced by VpPower(), and VpSqrt().

◆ VpDtoV()

VP_EXPORT void VpDtoV ( Real m,
double  d 
)

◆ VpException()

VP_EXPORT int VpException ( unsigned short  f,
const char *  str,
int  always 
)

Definition at line 3755 of file bigdecimal.c.

Referenced by VpMemAlloc(), VpMemRealloc(), and VpSqrt().

◆ VpExponent10()

VP_EXPORT ssize_t VpExponent10 ( Real a)

Definition at line 5286 of file bigdecimal.c.

References BASE1, BASE_FIG, Real::exponent, Real::frac, VP_EXPORT, and VpHasVal.

Referenced by VpComp().

◆ VpFrac()

VP_EXPORT void VpFrac ( Real y,
Real x 
)

◆ VpFree()

VP_EXPORT void VpFree ( Real pv)

Definition at line 3533 of file bigdecimal.c.

References NULL, and xfree().

Referenced by VpPower(), and VpSqrt().

◆ VpGetDoubleNaN()

VP_EXPORT double VpGetDoubleNaN ( void  )

Definition at line 3714 of file bigdecimal.c.

Referenced by VpInit(), and VpVtoD().

◆ VpGetDoubleNegInf()

VP_EXPORT double VpGetDoubleNegInf ( void  )

Definition at line 3730 of file bigdecimal.c.

Referenced by VpInit(), and VpVtoD().

◆ VpGetDoubleNegZero()

VP_EXPORT double VpGetDoubleNegZero ( void  )

Definition at line 3738 of file bigdecimal.c.

Referenced by VpInit(), and VpVtoD().

◆ VpGetDoublePosInf()

VP_EXPORT double VpGetDoublePosInf ( void  )

Definition at line 3722 of file bigdecimal.c.

Referenced by VpInit(), and VpVtoD().

◆ VpGetPrecLimit()

VP_EXPORT size_t VpGetPrecLimit ( void  )

Definition at line 3598 of file bigdecimal.c.

References rb_thread_current(), and rb_thread_local_aref().

Referenced by VpAlloc(), and VpSetPrecLimit().

◆ VpGetRoundMode()

VP_EXPORT unsigned short VpGetRoundMode ( void  )

Definition at line 3633 of file bigdecimal.c.

References rb_thread_current(), and rb_thread_local_aref().

Referenced by VpSetRoundMode().

◆ VpInit()

VP_EXPORT size_t VpInit ( BDIGIT  BaseVal)

◆ VpIsRoundMode()

VP_EXPORT int VpIsRoundMode ( unsigned short  n)

◆ VpLeftRound()

VP_EXPORT int VpLeftRound ( Real y,
unsigned short  f,
ssize_t  nf 
)

Definition at line 6126 of file bigdecimal.c.

References BASE_FIG, BDIGIT, Real::frac, VP_EXPORT, VpExponent, VpHasVal, and VpMidRound().

◆ VpMemAlloc()

VP_EXPORT void* VpMemAlloc ( size_t  mb)

Definition at line 3509 of file bigdecimal.c.

References VP_EXCEPTION_MEMORY, VP_EXPORT, VpException(), and xmalloc.

◆ VpMemRealloc()

VP_EXPORT void* VpMemRealloc ( void *  ptr,
size_t  mb 
)

Definition at line 3523 of file bigdecimal.c.

References VP_EXCEPTION_MEMORY, VP_EXPORT, VpException(), and xrealloc.

◆ VpMidRound()

VP_EXPORT int VpMidRound ( Real y,
unsigned short  f,
ssize_t  nf 
)

◆ VpMult()

VP_EXPORT size_t VpMult ( Real c,
Real a,
Real b 
)

Definition at line 4679 of file bigdecimal.c.

References BDIGIT, and BDIGIT_DBL.

Referenced by VpPower(), and VpSqrt().

◆ VpNewRbClass()

VP_EXPORT Real* VpNewRbClass ( size_t  mx,
const char *  str,
VALUE  klass 
)

Definition at line 660 of file bigdecimal.c.

References Real::obj, RTYPEDDATA_DATA, TypedData_Wrap_Struct, VP_EXPORT, and VpAlloc().

Referenced by VpCreateRbObject().

◆ VpNumOfChars()

VP_EXPORT size_t VpNumOfChars ( Real vp,
const char *  pszFmt 
)

Definition at line 3882 of file bigdecimal.c.

References BASE_FIG, Real::exponent, NULL, Real::Prec, SIGNED_VALUE, VP_EXPORT, and VpIsDef.

◆ VpOne()

VP_EXPORT Real* VpOne ( void  )

Definition at line 3957 of file bigdecimal.c.

◆ VpPower()

VP_EXPORT int VpPower ( Real y,
Real x,
SIGNED_VALUE  n 
)

◆ VpSetPrecLimit()

VP_EXPORT size_t VpSetPrecLimit ( size_t  n)

Definition at line 3614 of file bigdecimal.c.

References rmpd_set_thread_local_precision_limit, and VpGetPrecLimit().

◆ VpSetRoundMode()

VP_EXPORT unsigned short VpSetRoundMode ( unsigned short  n)

◆ VpSqrt()

VP_EXPORT int VpSqrt ( Real y,
Real x 
)

◆ VpSzMantissa()

VP_EXPORT void VpSzMantissa ( Real a,
char *  psz 
)

◆ VpToFString()

VP_EXPORT void VpToFString ( Real a,
char *  psz,
size_t  fFmt,
int  fPlus 
)

◆ VpToSpecialString()

VP_EXPORT int VpToSpecialString ( Real a,
char *  psz,
int  fPlus 
)

Definition at line 5350 of file bigdecimal.c.

References SZ_INF, SZ_NaN, SZ_NINF, VP_EXPORT, VpIsNaN, VpIsNegInf, VpIsPosInf, VpIsPosZero, and VpIsZero.

Referenced by VpToFString().

◆ VpToString()

VP_EXPORT void VpToString ( Real a,
char *  psz,
size_t  fFmt,
int  fPlus 
)

Definition at line 5385 of file bigdecimal.c.

References BDIGIT.

◆ VpVtoD()

VP_EXPORT int VpVtoD ( double *  d,
SIGNED_VALUE e,
Real m 
)

Variable Documentation

◆ gOne_ABCED9B4_CE73__00400511F31D

volatile const double gOne_ABCED9B4_CE73__00400511F31D = 1.0

Definition at line 3686 of file bigdecimal.c.

◆ gZero_ABCED9B1_CE73__00400511F31D

volatile const double gZero_ABCED9B1_CE73__00400511F31D = 0.0

Definition at line 3685 of file bigdecimal.c.

◆ rb_cBigDecimal

VALUE rb_cBigDecimal

Definition at line 45 of file bigdecimal.c.

Referenced by VpCreateRbObject().

◆ rb_mBigMath

VALUE rb_mBigMath

Definition at line 46 of file bigdecimal.c.