62 CPCalculationNoError = 0;
117 var matches =
string.match(/^([+\-]?)((?:0|[0-9]\d*)?)(?:\.(\d*))?(?:[eE]([+\-]?)(\d+))?$/);
123 intpart = matches[2],
124 decpart = matches[3],
130 if (ds && ds ===
"-")
136 exponent = parseInt(exp) * ((es && es ===
"-")?-1:1);
139 exponent -= decpart.length;
141 var inputlength = (intpart?intpart.length:0) + (decpart?decpart.length:0);
148 else if (inputlength === 0)
160 for (; i < (intpart?intpart.length:0); i++)
164 Array.prototype.push.call(m, parseInt(intpart.charAt(i)));
169 for (; j < (decpart?decpart.length:0); j++)
174 Array.prototype.push.call(m, parseInt(decpart.charAt(j)));
177 var dcm = {_exponent:exponent, _isNegative:isNegative, _isCompact:NO, _isNaN:NO, _mantissa:m};
198 mantissa = ABS(mantissa);
202 Array.prototype.push.call(m, 0);
210 Array.prototype.unshift.call(m, parseInt(mantissa % 10));
211 mantissa = FLOOR(mantissa / 10);
214 var dcm = {_exponent:exponent, _isNegative:isNegative, _isCompact:YES, _isNaN:NO, _mantissa:m};
255 function _CPDecimalMakeMaximum()
265 function _CPDecimalMakeMinimum()
285 for (var i = 0; i < dcm._mantissa.length; i++)
286 if (dcm._mantissa[i] !== 0)
307 if (dcm._mantissa && (dcm._mantissa.length == 1) && (dcm._mantissa[0] == 1))
314 function _CPDecimalSet(t, s)
317 t._exponent = s._exponent;
318 t._isNegative = s._isNegative;
319 t._isCompact = s._isCompact;
321 t._mantissa = Array.prototype.slice.call(s._mantissa, 0);
324 function _CPDecimalSetZero(result)
326 result._mantissa = [0];
327 result._exponent = 0;
328 result._isNegative = NO;
329 result._isCompact = YES;
333 function _CPDecimalSetOne(result)
335 result._mantissa = [1];
336 result._exponent = 0;
337 result._isNegative = NO;
338 result._isCompact = YES;
349 return (dcm._isNaN)?YES:NO;
360 return {_exponent:dcm._exponent,
361 _isNegative:dcm._isNegative,
362 _isCompact:dcm._isCompact,
364 _mantissa:Array.prototype.slice.call(dcm._mantissa, 0)
378 if (leftOperand._isNaN && rightOperand._isNaN)
381 if (leftOperand._isNegative != rightOperand._isNegative)
383 if (rightOperand._isNegative)
390 var leftIsZero = (leftOperand._mantissa.length == 1 && leftOperand._mantissa[0] == 0),
391 rightIsZero = (rightOperand._mantissa.length == 1 && rightOperand._mantissa[0] == 0),
393 s1 = leftOperand._exponent + leftOperand._mantissa.length,
394 s2 = rightOperand._exponent + rightOperand._mantissa.length;
396 if (leftIsZero && rightIsZero)
399 if (leftIsZero || (s1 < s2 && !rightIsZero))
401 if (rightOperand._isNegative)
406 if (rightIsZero || (s1 > s2 && !leftIsZero))
408 if (leftOperand._isNegative)
415 var l = MIN(leftOperand._mantissa.length, rightOperand._mantissa.length),
420 var d = rightOperand._mantissa[i] - leftOperand._mantissa[i];
424 if (rightOperand._isNegative)
431 if (rightOperand._isNegative)
439 if (leftOperand._mantissa.length > rightOperand._mantissa.length)
441 if (rightOperand._isNegative)
446 if (leftOperand._mantissa.length < rightOperand._mantissa.length)
448 if (rightOperand._isNegative)
460 function _SimpleAdd(result, leftOperand, rightOperand, roundingMode, longMode)
462 var factor = (longMode)?2:1;
464 _CPDecimalSet(result, leftOperand);
466 var j = leftOperand._mantissa.length - rightOperand._mantissa.length,
467 l = rightOperand._mantissa.length,
470 error = CPCalculationNoError;
475 var d = rightOperand._mantissa[i] + result._mantissa[i + j] + carry;
484 result._mantissa[i + j] = d;
489 for (i = j - 1; i >= 0; i--)
491 if (result._mantissa[i] != 9)
493 result._mantissa[i]++;
497 result._mantissa[i] = 0;
502 Array.prototype.splice.call(result._mantissa, 0, 0, 1);
507 var scale = - result._exponent - 1;
531 function CPDecimalAdd(result, leftOperand, rightOperand, roundingMode, longMode)
533 if (leftOperand._isNaN || rightOperand._isNaN)
536 return CPCalculationNoError;
542 _CPDecimalSet(result, rightOperand);
543 return CPCalculationNoError;
548 _CPDecimalSet(result, leftOperand);
549 return CPCalculationNoError;
556 if (leftOperand._isNegative != rightOperand._isNegative)
558 if (leftOperand._isNegative)
574 ll = n1._mantissa.length,
575 lr = n2._mantissa.length;
585 if (leftOperand._isNegative)
593 adderror = _SimpleAdd(result, n1, n2, roundingMode, longMode);
597 adderror = _SimpleAdd(result, n2, n1, roundingMode, longMode);
600 result._isNegative = YES;
612 adderror = _SimpleAdd(result, n2, n1, roundingMode, longMode);
616 adderror = _SimpleAdd(result, n1, n2, roundingMode, longMode);
622 if (adderror == CPCalculationNoError)
629 function _SimpleSubtract(result, leftOperand, rightOperand, roundingMode)
631 var error = CPCalculationNoError,
633 l = rightOperand._mantissa.length,
634 j = leftOperand._mantissa.length - l,
637 _CPDecimalSet(result, leftOperand);
642 var d = result._mantissa[i + j] - rightOperand._mantissa[i] - borrow;
652 result._mantissa[i + j] = d;
657 for (i = j - 1; i >= 0; i--)
659 if (result._mantissa[i] != 0)
661 result._mantissa[i]--;
664 result._mantissa[i] = 9;
687 if (leftOperand._isNaN || rightOperand._isNaN)
690 return CPCalculationNoError;
696 _CPDecimalSet(result, rightOperand);
697 result._isNegative = !result._isNegative;
698 return CPCalculationNoError;
703 _CPDecimalSet(result, leftOperand);
704 return CPCalculationNoError;
709 error1 = CPCalculationNoError;
712 if (leftOperand._isNegative != rightOperand._isNegative)
714 if (leftOperand._isNegative)
717 error1 =
CPDecimalAdd(result, n1, rightOperand, roundingMode);
718 result._isNegative = YES;
730 return CPDecimalAdd(result, leftOperand, n2, roundingMode);
739 _CPDecimalSetZero(result);
740 return CPCalculationNoError;
744 if (leftOperand._isNegative)
751 error1 = _SimpleSubtract(result, n1, n2, roundingMode);
752 result._isNegative = YES;
756 error1 = _SimpleSubtract(result, n2, n1, roundingMode);
763 error1 = _SimpleSubtract(result, n2, n1, roundingMode);
764 result._isNegative = YES;
768 error1 = _SimpleSubtract(result, n1, n2, roundingMode);
774 if (error1 == CPCalculationNoError)
781 function _SimpleDivide(result, leftOperand, rightOperand, roundingMode)
783 var error = CPCalculationNoError,
790 _CPDecimalSetZero(result);
794 while ((used < leftOperand._mantissa.length) || (n1._mantissa.length
795 && !((n1._mantissa.length == 1) && (n1._mantissa[0] == 0))))
805 Array.prototype.push.call(n1._mantissa, 0);
811 if (used < leftOperand._mantissa.length)
814 if (n1._mantissa.length || leftOperand._mantissa[used])
817 Array.prototype.push.call(n1._mantissa, (leftOperand._mantissa[used]));
833 Array.prototype.push.call(n1._mantissa, 0);
845 result._mantissa[k - 1] = 0;
867 if (error1 != CPCalculationNoError)
870 result._mantissa[k - 1]++;
887 var error = CPCalculationNoError,
888 exp = leftOperand._exponent - rightOperand._exponent,
889 neg = (leftOperand._isNegative != rightOperand._isNegative);
891 if (leftOperand._isNaN || rightOperand._isNaN)
894 return CPCalculationNoError;
906 _CPDecimalSetZero(result);
907 return CPCalculationNoError;
920 error = _SimpleDivide(result, n1, n2, roundingMode);
939 CPDecimalSetZero(result);
944 result._exponent += exp;
945 result._isNegative = neg;
950 function _SimpleMultiply(result, leftOperand, rightOperand, roundingMode, powerMode)
952 var error = CPCalculationNoError,
957 _CPDecimalSetZero(result);
960 for (var i = 0; i < rightOperand._mantissa.length; i++)
962 _CPDecimalSetZero(n);
964 n._exponent = rightOperand._mantissa.length - i - 1;
966 d = rightOperand._mantissa[i];
971 for (var j = leftOperand._mantissa.length - 1; j >= 0; j--)
973 e = leftOperand._mantissa[j] * d + carry;
977 carry = FLOOR(e / 10);
984 n._mantissa[j + 1] = e;
987 n._mantissa[0] = carry;
991 error1 =
CPDecimalAdd(result, result, n, roundingMode, YES);
993 if (error1 != CPCalculationNoError)
1000 result._isNaN = YES;
1004 result._exponent += exp;
1009 result._isCompact = NO;
1031 var error = CPCalculationNoError,
1032 exp = leftOperand._exponent + rightOperand._exponent,
1033 neg = (leftOperand._isNegative != rightOperand._isNegative);
1035 if (leftOperand._isNaN || rightOperand._isNaN)
1037 result._isNaN = YES;
1038 return CPCalculationNoError;
1044 _CPDecimalSetZero(result);
1045 return CPCalculationNoError;
1052 result._isNaN = YES;
1065 n1._isNegative = NO;
1066 n2._isNegative = NO;
1070 ll = n1._mantissa.length,
1071 lr = n2._mantissa.length;
1082 error = _SimpleMultiply(result, n1, n2, roundingMode, powerMode);
1086 error = _SimpleMultiply(result, n2, n1, roundingMode, powerMode);
1093 result._isNaN = YES;
1108 _CPDecimalSetZero(result);
1113 result._exponent += exp;
1114 result._isNegative = neg;
1130 _CPDecimalSet(result, dcm);
1132 var p = result._exponent + power;
1136 result._isNaN = YES;
1142 result._isNaN = YES;
1146 result._exponent += power;
1147 return CPCalculationNoError;
1161 var error = CPCalculationNoError,
1162 neg = (dcm._isNegative && (power % 2)),
1165 n1._isNegative = NO;
1167 _CPDecimalSetOne(result);
1186 result._isNegative = neg;
1214 var factor = (longMode) ? 2 : 1;
1216 if (dcm1._isNaN || dcm2._isNaN)
1217 return CPCalculationNoError;
1220 if (!dcm1._isCompact)
1223 if (!dcm2._isCompact)
1226 if (dcm1._exponent == dcm2._exponent)
1227 return CPCalculationNoError;
1229 var e1 = dcm1._exponent,
1230 e2 = dcm2._exponent;
1233 var l2 = dcm2._mantissa.length,
1234 l1 = dcm1._mantissa.length,
1239 if (e2 > e1 && e1 >= 0 && e2 >= 0)
1241 else if (e2 > e1 && e1 < 0 && e2 >= 0)
1243 else if (e2 > e1 && e1 < 0 && e2 < 0)
1245 else if (e2 < e1 && e1 >= 0 && e2 >= 0)
1247 else if (e2 < e1 && e1 >= 0 && e2 < 0)
1249 else if (e2 < e1 && e1 < 0 && e2 < 0)
1257 for (var i = 0; i < l; i++)
1260 Array.prototype.push.call(dcm2._mantissa, 0);
1262 Array.prototype.push.call(dcm1._mantissa, 0);
1267 dcm2._exponent -= l;
1268 dcm2._isCompact = NO;
1272 dcm1._exponent -= l;
1273 dcm1._isCompact = NO;
1277 if (l != ABS(e2 - e1))
1293 if ((dcm1._exponent != dcm2._exponent) && ((!l1) || (!l2)))
1298 l1 = dcm1._mantissa.length;
1300 for (var i = 0; i < l; i++)
1302 dcm1._mantissa[i + l1] = 0;
1304 dcm1._isCompact = NO;
1305 dcm1._exponent = dcm2._exponent;
1309 l2 = dcm2._mantissa.length;
1311 for (var i = 0; i < l; i++)
1313 dcm2._mantissa[i + l2] = 0;
1315 dcm2._exponent = dcm1._exponent;
1316 dcm2._isCompact = NO;
1323 return CPCalculationNoError;
1340 _CPDecimalSet(result, dcm);
1345 if (!dcm._isCompact)
1354 var mc = result._mantissa.length,
1355 l = mc + scale + result._exponent;
1362 _CPDecimalSetZero(result);
1372 result._exponent += mc - l;
1374 switch (roundingMode)
1377 up = result._isNegative;
1381 up = !result._isNegative;
1385 n = result._mantissa[l];
1389 case _CPRoundHalfDown:
1390 n = result._mantissa[l];
1395 n = result._mantissa[l];
1406 c = result._mantissa[l - 1];
1407 up = ((c % 2) != 0);
1417 result._mantissa = Array.prototype.slice.call(result._mantissa, 0, l);
1421 for (var i = l-1; i >= 0; i--)
1423 if (result._mantissa[i] != 9)
1425 result._mantissa[i]++;
1429 result._mantissa[i] = 0;
1436 result._mantissa[0] = 1;
1443 Array.prototype.push.call(result._mantissa, 0);
1468 _CPDecimalSetZero(dcm);
1474 while (dcm._mantissa[0] === 0)
1475 Array.prototype.shift.call(dcm._mantissa);
1478 while (dcm._mantissa[dcm._mantissa.length - 1] === 0)
1480 Array.prototype.pop.call(dcm._mantissa);
1491 dcm._isCompact = YES;
1511 if (dcm._isNegative)
1514 var k = dcm._mantissa.length,
1515 l = ((dcm._exponent < 0) ? dcm._exponent : 0) + k;
1521 for (i = 0; i < ABS(l); i++)
1532 for (i = 0; i < l; i++)
1534 string += dcm._mantissa[i];
1540 for (i = l; i < k; i++)
1542 string += dcm._mantissa[i];
1546 for (i = 0; i < dcm._exponent; i++)