summaryrefslogtreecommitdiff
path: root/source/luametatex/source/mp/mpc/mpmathdecimal.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/mp/mpc/mpmathdecimal.c')
-rw-r--r--source/luametatex/source/mp/mpc/mpmathdecimal.c79
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);