62 CPCalculationNoError = 0;
117 var matches =
string.match(/^([+\-]?)((?:0|[1-9]\d*)?)(?:\.(\d*))?(?:[eE]([+\-]?)(\d+))?$/);
122 intpart = matches[2],
123 decpart = matches[3],
128 if (ds && ds ===
"-")
133 exponent = parseInt(exp) * ((es && es ===
"-")?-1:1);
136 exponent -= decpart.length;
138 var inputlength = (intpart?intpart.length:0) + (decpart?decpart.length:0);
144 else if (inputlength === 0)
155 for (; i < (intpart?intpart.length:0); i++)
159 Array.prototype.push.call(m, parseInt(intpart.charAt(i)));
162 for (; j < (decpart?decpart.length:0); j++)
166 Array.prototype.push.call(m, parseInt(decpart.charAt(j)));
169 var dcm = {_exponent:exponent, _isNegative:isNegative, _isCompact:NO, _isNaN:NO, _mantissa:m};
190 mantissa = ABS(mantissa);
194 Array.prototype.push.call(m, 0);
202 Array.prototype.unshift.call(m, parseInt(mantissa % 10));
203 mantissa = FLOOR(mantissa / 10);
206 var dcm = {_exponent:exponent, _isNegative:isNegative, _isCompact:YES, _isNaN:NO, _mantissa:m};
247 function _CPDecimalMakeMaximum()
257 function _CPDecimalMakeMinimum()
277 for (var i = 0; i < dcm._mantissa.length; i++)
278 if (dcm._mantissa[i] !== 0)
298 if (dcm._mantissa && (dcm._mantissa.length == 1) && (dcm._mantissa[0] == 1))
305 function _CPDecimalSet(t,s)
308 t._exponent = s._exponent;
309 t._isNegative = s._isNegative;
310 t._isCompact = s._isCompact;
312 t._mantissa = Array.prototype.slice.call(s._mantissa, 0);
315 function _CPDecimalSetZero(result)
317 result._mantissa = [0];
318 result._exponent = 0;
319 result._isNegative = NO;
320 result._isCompact = YES;
324 function _CPDecimalSetOne(result)
326 result._mantissa = [1];
327 result._exponent = 0;
328 result._isNegative = NO;
329 result._isCompact = YES;
340 return (dcm._isNaN)?YES:NO;
351 return {_exponent:dcm._exponent,
352 _isNegative:dcm._isNegative,
353 _isCompact:dcm._isCompact,
355 _mantissa:Array.prototype.slice.call(dcm._mantissa, 0)
369 if (leftOperand._isNaN && rightOperand._isNaN)
372 if (leftOperand._isNegative != rightOperand._isNegative)
374 if (rightOperand._isNegative)
381 var leftIsZero = (leftOperand._mantissa.length == 1 && leftOperand._mantissa[0] == 0),
382 rightIsZero = (rightOperand._mantissa.length == 1 && rightOperand._mantissa[0] == 0),
384 s1 = leftOperand._exponent + leftOperand._mantissa.length,
385 s2 = rightOperand._exponent + rightOperand._mantissa.length;
387 if (leftIsZero || s1 < s2)
389 if (rightOperand._isNegative)
394 if (rightIsZero || s1 > s2)
396 if (rightOperand._isNegative)
403 var l = MIN(leftOperand._mantissa.length, rightOperand._mantissa.length),
408 var d = rightOperand._mantissa[i] - leftOperand._mantissa[i];
412 if (rightOperand._isNegative)
419 if (rightOperand._isNegative)
427 if (leftOperand._mantissa.length > rightOperand._mantissa.length)
429 if (rightOperand._isNegative)
434 if (leftOperand._mantissa.length < rightOperand._mantissa.length)
436 if (rightOperand._isNegative)
448 function _SimpleAdd(result, leftOperand, rightOperand, roundingMode, longMode)
450 var factor = (longMode)?2:1;
452 _CPDecimalSet(result, leftOperand);
454 var j = leftOperand._mantissa.length - rightOperand._mantissa.length,
455 l = rightOperand._mantissa.length,
458 error = CPCalculationNoError;
463 var d = rightOperand._mantissa[i] + result._mantissa[i + j] + carry;
472 result._mantissa[i + j] = d;
477 for (i = j - 1; i >= 0; i--)
479 if (result._mantissa[i] != 9)
481 result._mantissa[i]++;
485 result._mantissa[i] = 0;
490 Array.prototype.splice.call(result._mantissa, 0, 0, 1);
495 var scale = - result._exponent - 1;
519 function CPDecimalAdd(result, leftOperand, rightOperand, roundingMode, longMode)
521 if (leftOperand._isNaN || rightOperand._isNaN)
524 return CPCalculationNoError;
529 _CPDecimalSet(result, rightOperand);
530 return CPCalculationNoError;
534 _CPDecimalSet(result, leftOperand);
535 return CPCalculationNoError;
542 if (leftOperand._isNegative != rightOperand._isNegative)
544 if (leftOperand._isNegative)
560 ll = n1._mantissa.length,
561 lr = n2._mantissa.length;
570 if (leftOperand._isNegative)
577 adderror = _SimpleAdd(result, n1, n2, roundingMode, longMode);
581 adderror = _SimpleAdd(result, n2, n1, roundingMode, longMode);
583 result._isNegative = YES;
594 adderror = _SimpleAdd(result, n2, n1, roundingMode, longMode);
598 adderror = _SimpleAdd(result, n1, n2, roundingMode, longMode);
604 if (adderror == CPCalculationNoError)
611 function _SimpleSubtract(result, leftOperand, rightOperand, roundingMode)
613 var error = CPCalculationNoError,
615 l = rightOperand._mantissa.length,
616 j = leftOperand._mantissa.length - l,
619 _CPDecimalSet(result, leftOperand);
624 var d = result._mantissa[i + j] - rightOperand._mantissa[i] - borrow;
633 result._mantissa[i + j] = d;
638 for (i = j - 1; i >= 0; i--)
640 if (result._mantissa[i] != 0)
642 result._mantissa[i]--;
645 result._mantissa[i] = 9;
668 if (leftOperand._isNaN || rightOperand._isNaN)
671 return CPCalculationNoError;
677 _CPDecimalSet(result, rightOperand);
678 result._isNegative = !result._isNegative;
679 return CPCalculationNoError;
683 _CPDecimalSet(result, leftOperand);
684 return CPCalculationNoError;
689 error1 = CPCalculationNoError;
692 if (leftOperand._isNegative != rightOperand._isNegative)
694 if (leftOperand._isNegative)
697 error1 =
CPDecimalAdd(result, n1, rightOperand, roundingMode);
698 result._isNegative = YES;
708 return CPDecimalAdd(result, leftOperand, n2, roundingMode);
717 _CPDecimalSetZero(result);
718 return CPCalculationNoError;
722 if (leftOperand._isNegative)
728 error1 = _SimpleSubtract(result, n1, n2, roundingMode);
729 result._isNegative = YES;
733 error1 = _SimpleSubtract(result, n2, n1, roundingMode);
740 error1 = _SimpleSubtract(result, n2, n1, roundingMode);
741 result._isNegative = YES;
745 error1 = _SimpleSubtract(result, n1, n2, roundingMode);
751 if (error1 == CPCalculationNoError)
758 function _SimpleDivide(result, leftOperand, rightOperand, roundingMode)
760 var error = CPCalculationNoError,
767 _CPDecimalSetZero(result);
771 while ((used < leftOperand._mantissa.length) || (n1._mantissa.length
772 && !((n1._mantissa.length == 1) && (n1._mantissa[0] == 0))))
781 Array.prototype.push.call(n1._mantissa, 0);
787 if (used < leftOperand._mantissa.length)
790 if (n1._mantissa.length || leftOperand._mantissa[used])
793 Array.prototype.push.call(n1._mantissa, (leftOperand._mantissa[used]));
807 Array.prototype.push.call(n1._mantissa, 0);
819 result._mantissa[k - 1] = 0;
840 if (error1 != CPCalculationNoError)
843 result._mantissa[k - 1]++;
860 var error = CPCalculationNoError,
861 exp = leftOperand._exponent - rightOperand._exponent,
862 neg = (leftOperand._isNegative != rightOperand._isNegative);
864 if (leftOperand._isNaN || rightOperand._isNaN)
867 return CPCalculationNoError;
878 _CPDecimalSetZero(result);
879 return CPCalculationNoError;
892 error = _SimpleDivide(result, n1, n2, roundingMode);
911 CPDecimalSetZero(result);
915 result._exponent += exp;
916 result._isNegative = neg;
921 function _SimpleMultiply(result, leftOperand, rightOperand, roundingMode, powerMode)
923 var error = CPCalculationNoError,
928 _CPDecimalSetZero(result);
932 for (; i < rightOperand._mantissa.length; i++)
934 _CPDecimalSetZero(n);
936 n._exponent = rightOperand._mantissa.length - i - 1;
938 d = rightOperand._mantissa[i];
944 for (j = leftOperand._mantissa.length - 1; j >= 0; j--)
946 e = leftOperand._mantissa[j] * d + carry;
949 carry = FLOOR(e / 10);
956 n._mantissa[j + 1] = e;
958 n._mantissa[0] = carry;
962 error1 =
CPDecimalAdd(result, result, n, roundingMode, YES);
964 if (error1 != CPCalculationNoError)
974 result._exponent += exp;
979 result._isCompact = NO;
999 var error = CPCalculationNoError,
1000 exp = leftOperand._exponent + rightOperand._exponent,
1001 neg = (leftOperand._isNegative != rightOperand._isNegative);
1003 if (leftOperand._isNaN || rightOperand._isNaN)
1005 result._isNaN = YES;
1006 return CPCalculationNoError;
1012 _CPDecimalSetZero(result);
1013 return CPCalculationNoError;
1020 result._isNaN = YES;
1032 n1._isNegative = NO;
1033 n2._isNegative = NO;
1037 ll = n1._mantissa.length,
1038 lr = n2._mantissa.length;
1049 error = _SimpleMultiply(result, n1, n2, roundingMode, powerMode);
1053 error = _SimpleMultiply(result, n2, n1, roundingMode, powerMode);
1060 result._isNaN = YES;
1074 _CPDecimalSetZero(result);
1079 result._exponent += exp;
1080 result._isNegative = neg;
1096 _CPDecimalSet(result, dcm);
1097 var p = result._exponent + power;
1100 result._isNaN = YES;
1105 result._isNaN = YES;
1108 result._exponent += power;
1109 return CPCalculationNoError;
1123 var error = CPCalculationNoError,
1124 neg = (dcm._isNegative && (power % 2)),
1127 n1._isNegative = NO;
1129 _CPDecimalSetOne(result);
1147 result._isNegative = neg;
1175 var factor = (longMode)?2:1;
1177 if (dcm1._isNaN || dcm2._isNaN)
1178 return CPCalculationNoError;
1181 if (!dcm1._isCompact)
1183 if (!dcm2._isCompact)
1186 if (dcm1._exponent == dcm2._exponent)
1187 return CPCalculationNoError;
1189 var e1 = dcm1._exponent,
1190 e2 = dcm2._exponent;
1193 var l2 = dcm2._mantissa.length,
1194 l1 = dcm1._mantissa.length,
1198 if (e2 > e1 && e1 >= 0 && e2 >= 0)
1200 else if (e2 > e1 && e1 < 0 && e2 >= 0)
1202 else if (e2 > e1 && e1 < 0 && e2 < 0)
1204 else if (e2 < e1 && e1 >= 0 && e2 >= 0)
1206 else if (e2 < e1 && e1 >= 0 && e2 < 0)
1208 else if (e2 < e1 && e1 < 0 && e2 < 0)
1216 for (var i = 0; i < l; i++)
1219 Array.prototype.push.call(dcm2._mantissa, 0);
1221 Array.prototype.push.call(dcm1._mantissa, 0);
1225 dcm2._exponent -= l;
1226 dcm2._isCompact = NO;
1230 dcm1._exponent -= l;
1231 dcm1._isCompact = NO;
1235 if (l != ABS(e2 - e1))
1251 if ((dcm1._exponent != dcm2._exponent) && ((!l1) || (!l2)))
1256 l1 = dcm1._mantissa.length;
1258 for (var i = 0; i < l; i++)
1260 dcm1._mantissa[i + l1] = 0;
1262 dcm1._isCompact = NO;
1263 dcm1._exponent = dcm2._exponent;
1267 l2 = dcm2._mantissa.length;
1269 for (var i = 0; i < l; i++)
1271 dcm2._mantissa[i + l2] = 0;
1273 dcm2._exponent = dcm1._exponent;
1274 dcm2._isCompact = NO;
1280 return CPCalculationNoError;
1300 if (!dcm._isCompact)
1309 _CPDecimalSet(result,dcm);
1311 var mc = result._mantissa.length,
1312 l = mc + scale + result._exponent;
1318 _CPDecimalSetZero(result);
1326 result._exponent += mc - l;
1328 switch (roundingMode)
1331 up = result._isNegative;
1334 up = !result._isNegative;
1337 n = result._mantissa[l];
1340 case _CPRoundHalfDown:
1341 n = result._mantissa[l];
1345 n = result._mantissa[l];
1355 c = result._mantissa[l - 1];
1356 up = ((c % 2) != 0);
1364 result._mantissa = Array.prototype.slice.call(result._mantissa, 0, l);
1368 for (var i = l-1; i >= 0; i--)
1370 if (result._mantissa[i] != 9)
1372 result._mantissa[i]++;
1375 result._mantissa[i] = 0;
1381 result._mantissa[0] = 1;
1387 Array.prototype.push.call(result._mantissa, 0);
1412 _CPDecimalSetZero(dcm);
1417 while (dcm._mantissa[0] === 0)
1419 Array.prototype.shift.call(dcm._mantissa);
1422 while (dcm._mantissa[dcm._mantissa.length - 1] === 0)
1424 Array.prototype.pop.call(dcm._mantissa);
1434 dcm._isCompact = YES;
1454 if (dcm._isNegative)
1457 var k = dcm._mantissa.length,
1458 l = ((dcm._exponent < 0) ? dcm._exponent : 0) + k;
1464 for (i = 0; i < ABS(l); i++)
1475 for (i = 0; i < l; i++)
1477 string += dcm._mantissa[i];
1482 for (i = l; i < k; i++)
1484 string += dcm._mantissa[i];
1487 for (i = 0; i < dcm._exponent; i++)