68 size_t saveFuzz, saveDigits;
70 if (argCount == 0)
return this;
75 saveFuzz = CurrentActivation->
fuzz();
76 saveDigits = CurrentActivation->
digits();
85 for (arg=0; arg < argCount; arg++)
87 nextObject = args[arg];
93 CurrentActivation->
setFuzz(saveFuzz);
139 CurrentActivation->
setFuzz(saveFuzz);
144 CurrentActivation->
setFuzz(saveFuzz);
164 resultDigits = this->
length;
172 while (carry && resultDigits-- > 0)
181 RoundNum = *NumPtr + carry;
184 *NumPtr-- = (char)RoundNum;
236 resultVal = this->
exp + this->
length - 1;
288 if (this->
length > NumberDigits)
290 this->
length = NumberDigits;
292 this->
exp += this->
length - NumberDigits;
304 return(
char *)memcpy(((result + resultLen - 1) - this->
length), NumPtr, this->
length);
316 while (!*AccumPtr && this->
length>1)
335 if (resultPtr == NULL)
347 if (this->
length > NumberDigits)
349 size_t extra = this->
length - NumberDigits;
350 this->
length = NumberDigits;
367 if (!*resultPtr && this->
length == 1)
374 resultVal = this->
exp + this->
length - 1;
396 if (newObj->
length > NumberDigits)
404 newObj->
exp += newObj->
length - NumberDigits;
405 newObj->
length = NumberDigits;
406 if (rounding ==
ROUND)
440 if (newObj->
length > numberDigits)
445 if (newObj->
length > targetLength)
449 newObj->exp += newObj->
length - targetLength;
450 newObj->
length = targetLength;
451 if (rounding ==
ROUND)
454 newObj->mathRound(newObj->number);
466 unsigned int operation,
467 size_t NumberDigits )
473 char *leftPtr,*rightPtr,*resultPtr;
474 char *resultBuffer = NULL;
475 int right_sign, carry, addDigit, rc;
479 wholenumber_t aLeftExp, aRightExp, rightExp, leftExp, MinExp;
480 size_t rightLength, leftLength;
482 size_t maxLength = NumberDigits + 1;
491 rightExp = right->
exp;
493 leftLength = left->
length;
494 rightLength = right->
length;
496 if (leftLength > NumberDigits)
500 if (leftLength > maxLength)
502 leftExp += leftLength - maxLength;
503 leftLength = maxLength;
507 if (rightLength > NumberDigits)
511 if (rightLength > maxLength)
514 rightExp += rightLength - maxLength;
515 rightLength = maxLength;
520 if (leftExp <= rightExp)
530 aLeftExp = leftExp - MinExp;
531 aRightExp = rightExp - MinExp;
532 right_sign = right->
sign;
541 else if (right->
sign==0)
569 result = temp1->
clone();
573 if ((temp1 == right) && (operation ==
OT_MINUS))
586 right_sign = -right_sign;
590 if (right_sign != left->
sign)
593 if (((leftLength == rightLength) && (leftExp == rightExp)) &&
606 ResultSize = maxLength;
614 leftPtr = left->
number + leftLength - 1;
616 rightPtr = right->
number + rightLength - 1;
631 if (LadjustDigits > 0 || RadjustDigits >0 )
633 if (LadjustDigits >= RadjustDigits)
636 adjustDigits = LadjustDigits;
640 adjustDigits = RadjustDigits;
651 aLeftExp -= adjustDigits;
653 rightPtr = rightPtr-adjustDigits;
654 rightExp += adjustDigits;
655 rightLength -= adjustDigits;
661 rightPtr = rightPtr-aLeftExp;
662 rightExp += aLeftExp;
663 rightLength -= adjustDigits;
664 adjustDigits -= aLeftExp;
673 aRightExp -= adjustDigits;
675 leftPtr = leftPtr-adjustDigits;
676 leftExp += adjustDigits;
677 leftLength -= adjustDigits;
683 leftPtr = leftPtr-aRightExp;
684 leftExp += aRightExp;
685 leftLength -= adjustDigits;
686 adjustDigits -= aRightExp;
693 leftExp += adjustDigits;
695 leftPtr = leftPtr-adjustDigits;
696 rightExp += adjustDigits;
697 rightPtr = rightPtr - adjustDigits;
702 resultBuffer = resultBufFast;
710 resultPtr = resultBuffer + NumberDigits*2;
732 if (rightPtr >= right->
number)
734 *resultPtr-- = *rightPtr--;
743 result->
exp = rightExp;
754 if (leftPtr >= left->
number)
756 *resultPtr-- = *leftPtr--;
764 result->
exp = leftExp;
768 result->
exp = leftExp;
771 while ( (leftPtr >= left->
number) &&
772 (rightPtr >= right->
number) )
778 addDigit = carry + (*leftPtr--) + *(rightPtr--);
789 *resultPtr-- = (char)addDigit;
796 while (leftPtr >= left->
number)
799 addDigit = carry + (*leftPtr--);
810 *resultPtr-- = (char)addDigit;
814 while (rightPtr >= right->
number)
817 addDigit = carry + (*rightPtr--);
828 *resultPtr-- = (char)addDigit;
843 if ((aLeftExp + leftLength)>(aRightExp + rightLength))
846 subtractNumbers(left, leftPtr, aLeftExp, right, rightPtr, aRightExp, result, &resultPtr);
851 result->
exp = rightExp;
855 result->
exp = leftExp;
861 else if ((aLeftExp + leftLength)<(aRightExp + rightLength))
864 subtractNumbers(right, rightPtr, aRightExp, left, leftPtr, aLeftExp, result, &resultPtr);
869 result->
exp = rightExp;
873 result->
exp = leftExp;
876 result->
sign = right_sign;
885 else if (rightLength < leftLength)
891 if ((rc = memcmp(right->
number, left->
number, rightLength)) > 0)
894 subtractNumbers(right, rightPtr, aRightExp, left, leftPtr, aLeftExp, result, &resultPtr);
895 result->
sign = right_sign;
900 subtractNumbers(left, leftPtr, aLeftExp, right, rightPtr, aRightExp, result, &resultPtr);
903 result->
exp = leftExp;
911 if ((rc = memcmp(left->
number, right->
number, leftLength)) > 0)
914 subtractNumbers(left, leftPtr, aLeftExp, right, rightPtr, aRightExp, result, &resultPtr);
915 result->
exp = rightExp;
924 subtractNumbers(right, rightPtr, aRightExp, left, leftPtr, aLeftExp, result, &resultPtr);
925 result->
exp = rightExp;
928 result->
sign = right_sign;
932 if (leftLength < rightLength)
936 subtractNumbers(right, rightPtr, aRightExp, left, leftPtr, aLeftExp, result, &resultPtr);
937 result->
exp = rightExp;
940 result->
sign = right_sign;
971 const char *largerPtr,
974 const char *smallerPtr,
984 int borrow, subDigit;
987 resultPtr = *presultPtr;
1002 while (aLargerExp--)
1014 if (smallerPtr >= smaller->
number)
1016 subDigit = *smallerPtr--;
1026 subDigit = borrow + 10 - subDigit;
1039 *resultPtr-- = (char)subDigit;
1043 while (aSmallerExp--)
1059 if (largerPtr >= larger->
number)
1061 *resultPtr-- = *largerPtr--;
1065 *resultPtr-- =
'\0';
1074 while (smallerPtr >= smaller->
number)
1080 subDigit = borrow + (*largerPtr--) - *(smallerPtr--);
1091 *resultPtr-- = (char)subDigit;
1098 while (largerPtr >= larger->
number)
1100 subDigit = borrow + (*largerPtr--);
1111 *resultPtr-- = (char)subDigit;
1115 *presultPtr = resultPtr;
1134 *Value-- = (char)Digit;
1139 *Value-- = (char)Digit;
1143 if (Value < HighDigit)
1167 while (OutPtr > HighDigit)
1170 Digit = (
unsigned int )((*OutPtr * 10) + Carry);
1173 Carry = (int)(Digit / 16);
1174 Digit &= (
unsigned int )0x0000000f;
1180 *OutPtr-- = (char)Digit;
1184 *OutPtr-- = (char)Carry;
1201 while (Digit || Carry)
1203 Digit += *Accum + Carry;
1208 *Accum-- = (char)Digit;
1212 *Accum-- = (char)Digit;
1217 if (Accum < HighDigit)
1243 while (OutPtr > HighDigit)
1246 Digit = (
unsigned int )((*OutPtr * 16) + Carry);
1249 Carry = (int)(Digit / 10);
1256 *OutPtr-- = (char)Digit;
1262 *OutPtr-- = (char)Digit;