67 int carry, ResultChar;
81 ResultChar = carry + *AccumPtr + (MultChar * *top--);
84 carry = ResultChar / 10;
85 ResultChar -= carry * 10;
91 *AccumPtr-- = ResultChar;
96 *AccumPtr-- = (char)carry;
107 char *ResultPtr, *AccumPtr, *Current, *OutPtr;
111 size_t NumberDigits, TotalDigits, ExtraDigit;
120 if (left->
sign == 0 || right->
sign == 0)
136 TotalDigits = ((NumberDigits+1) * 2) + 1;
145 OutPtr = resultBufFast;
147 memset(OutPtr,
'\0',TotalDigits);
153 ResultPtr = AccumPtr + TotalDigits - 1;
158 for (i = SmallNum->
length ; i ; i-- )
173 AccumLen = (++ResultPtr - AccumPtr) + SmallNum->
length;
179 if (AccumLen > NumberDigits)
182 ExtraDigit = AccumLen -(NumberDigits + 1);
183 AccumLen = NumberDigits + 1;
193 result->
exp = LargeNum->
exp + SmallNum->
exp + ExtraDigit;
196 result->
length = AccumLen;
204 char *data2,
size_t length2,
205 char *result,
int Mult)
231 data1 += (length1 -1);
232 data2 += (length2 -1);
236 extra = length1 - length2;
242 DivChar = carry + *data1-- - (*data2-- * Mult);
246 carry = (DivChar/10) -10;
253 *--OutPtr = (char)DivChar;
262 *--OutPtr = (char)*data1--;
269 DivChar = carry + *data1--;
274 *--OutPtr = (char)DivChar;
278 *--OutPtr = (char)DivChar;
281 *--OutPtr = *data1--;
307 char *resultPtr, *Output, *rightPtr, *leftPtr, *SaveLeftPtr, *SaveRightPtr;
312 size_t NumberDigits, totalDigits, resultDigits;
333 else if (!this->
sign)
347 CalcExp = left->
exp - right->
exp;
367 totalDigits = ((NumberDigits + 1) * 2) + 1;
380 leftPtr = leftBufFast;
381 rightPtr = rightBufFast;
388 memset(leftPtr + left->
length,
'\0', totalDigits - left->
length);
391 memset(rightPtr + right->
length,
'\0', totalDigits - right->
length);
399 SaveLeftPtr = leftPtr;
400 SaveRightPtr = rightPtr;
420 SaveLeft->
exp = NumberDigits * 2 - SaveLeft->
length + 1;
421 SaveRight->
exp = rightPadding;
435 DivChar = *Num2 * 10;
436 if (SaveRight->
length > 1)
438 DivChar += *(Num2 + 1);
475 rc = memcmp(Num1, Num2, SaveLeft->
length);
486 *resultPtr++ = (char)(thisDigit + 1);
488 goto PowerDivideDone;
502 multiplier = *Num1 * 10 + *(Num1 + 1);
513 multiplier = multiplier * 10 / DivChar;
525 thisDigit += multiplier;
532 while (*Num1 == 0 && SaveLeft->
length > 1)
540 if (resultDigits || thisDigit)
542 *resultPtr++ = (char) thisDigit;
548 if (*Num1 ==
'\0' || resultDigits > NumberDigits)
563 if (SaveLeft->
length == 1 && *Num1 ==
'\0')
573 if (rightPadding > 0)
590 ( resultDigits + CalcExp) > NumberDigits) ||
591 (CalcExp < 0 && (size_t)
Numerics::abs(CalcExp) > resultDigits)))
613 SaveLeftPtr += left->
length;
615 SaveRightPtr = resultPtr + SaveLeft->
length + adjustNum1;
617 Accum->
exp = left->
exp - (SaveRightPtr - SaveLeftPtr);
632 result = this->
clone();
633 result->setupNumber();
644 Accum->
length = resultDigits;
645 Accum->
exp = CalcExp;
646 if (Accum->
length > NumberDigits)
650 Accum->
exp += (Accum->
length - NumberDigits);
651 Accum->
length = NumberDigits;
656 Num1 = resultPtr + Accum->
length - 1;
657 while (!*Num1 && Accum->
length)
674 result->exp = Accum->
exp;
675 result->sign = Accum->
sign;
677 result->adjustPrecision(resultPtr, NumberDigits);
689 char *Accum, *AccumPtr, *OutPtr, *TempPtr;
697 NegativePower =
false;
707 NegativePower =
true;
708 powerValue = -powerValue;
724 else if (powerValue == 0)
763 for (extra=0, OldNorm = powerValue; OldNorm ;extra++ )
767 NumberDigits += (extra + 1);
771 AccumLen = (2 * (NumberDigits+1)) + 1;
788 while (!((
size_t)powerValue &
HIBIT))
800 if ((
size_t) powerValue &
HIBIT)
811 AccumPtr = AccumObj->
adjustNumber(AccumPtr, Accum, AccumLen, NumberDigits);
818 AccumPtr =
multiplyPower(AccumPtr, AccumObj, AccumPtr, AccumObj, OutPtr, AccumLen, NumberDigits);
823 AccumPtr = AccumObj->
adjustNumber(AccumPtr, Accum, AccumLen, NumberDigits);
831 AccumPtr =
dividePower(AccumPtr, AccumObj, Accum, NumberDigits);
834 NumberDigits -= (extra + 1);
839 if (AccumObj->
length > NumberDigits)
843 AccumObj->
exp += (AccumObj->
length - NumberDigits);
844 AccumObj->
length = NumberDigits;
849 TempPtr = AccumPtr + AccumObj->
length -1;
851 while (!*TempPtr && AccumObj->
length)
863 result->
exp = AccumObj->
exp;
878 char *OutPtr,
size_t OutLen,
size_t NumberDigits)
883 char *current, *resultPtr;
884 char *AccumPtr = NULL;
891 memset(OutPtr,
'\0', OutLen);
894 resultPtr = OutPtr + OutLen - 1;
897 current = rightPtr + right->
length;
899 for (i = right->
length ; i ; i-- )
912 AccumLen = (size_t)(++resultPtr - AccumPtr) + right->
length;
918 if (AccumLen > NumberDigits)
920 ExtraDigit = AccumLen - NumberDigits;
928 left->
exp += (right->
exp + ExtraDigit);
944 char *resultPtr, *leftPtr, *result;
946 int DivChar, thisDigit;
958 totalDigits = ((NumberDigits + 1) * 2) + 1;
974 memset(leftPtr + 1,
'\0', totalDigits - 1);
990 DivChar = *Num2 * 10;
992 DivChar += *(Num2 + 1);
1029 rc = memcmp(Num1, Num2, left->
length);
1038 *resultPtr++ = (char)(thisDigit + 1);
1040 goto PowerDivideDone;
1052 multiplier = *Num1 * 10 + *(Num1 + 1);
1060 multiplier = multiplier * 10 / DivChar;
1061 if (multiplier == 0)
1066 thisDigit += multiplier;
1073 if (resultDigits || thisDigit)
1075 *resultPtr++ = (char) thisDigit;
1080 if (*Num1 ==
'\0' || resultDigits > NumberDigits)
1087 if (left->
length == 1 && *Num1 ==
'\0')
1097 Num1 = (
char *)memmove(leftPtr, Num1, left->
length);
1100 memset(Num1 + left->
length,
'\0', totalDigits - left->
length);
1106 Accum->
length = resultDigits;
1107 Accum->
exp = CalcExp;
1108 memcpy(Output, result, resultDigits);