diff options
Diffstat (limited to 'source/luametatex/source/mp/mpc/mpmathdecimal.c')
-rw-r--r-- | source/luametatex/source/mp/mpc/mpmathdecimal.c | 79 |
1 files changed, 41 insertions, 38 deletions
diff --git a/source/luametatex/source/mp/mpc/mpmathdecimal.c b/source/luametatex/source/mp/mpc/mpmathdecimal.c index 268217f3e..597fe9f61 100644 --- a/source/luametatex/source/mp/mpc/mpmathdecimal.c +++ b/source/luametatex/source/mp/mpc/mpmathdecimal.c @@ -152,24 +152,63 @@ mp_decimal_info mp_decimal_data = { .last_cached_factorial = 0, .initialized = 0, }; + +void mp_decnumber_check(MP mp, decNumber *dec, decContext *context) +{ + int test = 0; + (void) mp; + if (context->status & DEC_Overflow) { + test = 1; + context->status &= ~DEC_Overflow; + } + if (context->status & DEC_Underflow) { + test = 1; + context->status &= ~DEC_Underflow; + } + if (context->status & DEC_Errors) { + test = 1; + decNumberZero(dec); + } + context->status = 0; + if (decNumberIsSpecial(dec)) { + test = 1; + if (decNumberIsInfinite(dec)) { + if (decNumberIsNegative(dec)) { + decNumberCopyNegate(dec, &mp_decimal_data.EL_GORDO_decNumber); + } else { + decNumberCopy(dec, &mp_decimal_data.EL_GORDO_decNumber); + } + } else { + decNumberZero(dec); + } + } + if (decNumberIsZero(dec) && decNumberIsNegative(dec)) { + decNumberZero(dec); + } + mp->arith_error = test; +} + static void checkZero(decNumber *ret) { if (decNumberIsZero(ret) && decNumberIsNegative(ret)) { decNumberZero(ret); } } + static int decNumberLess(decNumber *a, decNumber *b) { decNumber comp; decNumberCompare(&comp, a, b, &mp_decimal_data.set); return decNumberIsNegative(&comp); } + static int decNumberGreater(decNumber *a, decNumber *b) { decNumber comp; decNumberCompare(&comp, a, b, &mp_decimal_data.set); return decNumberIsPositive(&comp); } + static void decNumberFromDouble(decNumber *A, double B) { char buffer[1000]; @@ -183,6 +222,7 @@ static void decNumberFromDouble(decNumber *A, double B) } decNumberFromString(A, buffer, &mp_decimal_data.set); } + static double decNumberToDouble(decNumber *A) { char *buffer = mp_memory_allocate(A->digits + 14); @@ -197,40 +237,6 @@ static double decNumberToDouble(decNumber *A) } } -void mp_decnumber_check(MP mp, decNumber *dec, decContext *context) -{ - int test = 0; - (void) mp; - if (context->status & DEC_Overflow) { - test = 1; - context->status &= ~DEC_Overflow; - } - if (context->status & DEC_Underflow) { - test = 1; - context->status &= ~DEC_Underflow; - } - if (context->status & DEC_Errors) { - test = 1; - decNumberZero(dec); - } - context->status = 0; - if (decNumberIsSpecial(dec)) { - test = 1; - if (decNumberIsInfinite(dec)) { - if (decNumberIsNegative(dec)) { - decNumberCopyNegate(dec, &mp_decimal_data.EL_GORDO_decNumber); - } else { - decNumberCopy(dec, &mp_decimal_data.EL_GORDO_decNumber); - } - } else { - decNumberZero(dec); - } - } - if (decNumberIsZero(dec) && decNumberIsNegative(dec)) { - decNumberZero(dec); - } - mp->arith_error = test; -} static void decNumberAtan(decNumber *result, decNumber *x_orig, decContext *localset) { @@ -1436,7 +1442,6 @@ static void ran_array(long aa[],int n) } } - static void ran_start(long seed) { int t, j; @@ -1484,8 +1489,6 @@ static void ran_start(long seed) mp_decimal_random_data.ptr = &mp_decimal_random_data.started; } -# define ran_arr_next() (*mp_decimal_random_data.ptr>=0? *mp_decimal_random_data.ptr++: ran_arr_cycle()) - static long ran_arr_cycle(void) { if (mp_decimal_random_data.ptr == &mp_decimal_random_data.dummy) { @@ -1528,7 +1531,7 @@ static void mp_next_unif_random (MP mp, mp_number *ret) { decNumber a; decNumber b; - unsigned long int op = (unsigned)ran_arr_next(); + unsigned long int op = (unsigned) (*mp_decimal_random_data.ptr>=0? *mp_decimal_random_data.ptr++: ran_arr_cycle()); (void) mp; decNumberFromInt32(&a, op); decNumberFromInt32(&b, MM); |