| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| for (var numDigitsAfterDecimal = -1; numDigitsAfterDecimal <= 2; ++numDigitsAfterDecimal) { | |
| for (var lastDigit = 0; lastDigit <= (numDigitsAfterDecimal <= 0 ? 0 : 1); ++lastDigit) { | |
| for (var numDigits = 20; numDigits <= 23; ++numDigits) { | |
| var s = generateNumberString(numDigits - Math.max(0, numDigitsAfterDecimal), numDigitsAfterDecimal, lastDigit); | |
| echo(numDigits + " digits"); | |
| echo(s); | |
| echo(eval(s).toString()); | |
| echo(""); | |
| } | |
| } | |
| } | |
| function generateNumberString(numDigitsBeforeDecimal, numDigitsAfterDecimal, lastDigit) { | |
| if (numDigitsBeforeDecimal < 1) | |
| throw new Error("Invalid numDigits"); | |
| var useDecimal = numDigitsAfterDecimal >= 0; | |
| if (numDigitsAfterDecimal < 0) | |
| numDigitsAfterDecimal = 0; | |
| var s = "1"; | |
| for (var i = 1; i < numDigitsBeforeDecimal; ++i) | |
| s += "0"; | |
| if (useDecimal) | |
| s += "."; | |
| if (numDigitsAfterDecimal !== 0) { | |
| for (var i = 0; i < numDigitsAfterDecimal - 1; ++i) | |
| s += "0"; | |
| s += lastDigit; | |
| } | |
| return s; | |
| } | |
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
| function toString(o, quoteStrings) { | |
| switch (o) { | |
| case null: | |
| case undefined: | |
| return "" + o; | |
| } | |
| switch (typeof o) { | |
| case "boolean": | |
| case "number": | |
| { | |
| var s = "" + o; | |
| var e = s.indexOf("e"); | |
| for (var i = (e == -1 ? s.length : e) - 3; i > 0; i -= 3) | |
| s = s.substring(0, i) + "," + s.substring(i); | |
| return s; | |
| } | |
| case "string": | |
| { | |
| var hex = "0123456789abcdef"; | |
| var s = ""; | |
| for (var i = 0; i < o.length; ++i) { | |
| var c = o.charCodeAt(i); | |
| if (c === 0) | |
| s += "\\0"; | |
| else if (c >= 0x20 && c < 0x7f) | |
| s += quoteStrings && o.charAt(i) === "\"" ? "\\\"" : o.charAt(i); | |
| else if (c <= 0xff) | |
| s += "\\x" + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf); | |
| else | |
| s += "\\u" + hex.charAt((c >> 12) & 0xf) + hex.charAt((c >> 8) & 0xf) + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf); | |
| } | |
| if (quoteStrings) | |
| s = "\"" + s + "\""; | |
| return s; | |
| } | |
| case "object": | |
| case "function": | |
| break; | |
| default: | |
| return "<unknown type '" + typeof o + "'>"; | |
| } | |
| if (o instanceof Array) { | |
| var s = "["; | |
| for (var i = 0; i < o.length; ++i) { | |
| if (i) | |
| s += ", "; | |
| s += toString(o[i], true); | |
| } | |
| return s + "]"; | |
| } | |
| if (o instanceof Error) | |
| return o.name + ": " + o.message; | |
| if (o instanceof RegExp) | |
| return o.toString() + (o.lastIndex === 0 ? "" : " (lastIndex: " + o.lastIndex + ")"); | |
| return "" + o; | |
| } | |
| function echo(o) { | |
| var s = toString(o); | |
| try { | |
| document.write(s + "<br/>"); | |
| } catch (ex) { | |
| try { | |
| WScript.Echo(s); | |
| } catch (ex2) { | |
| print(s); | |
| } | |
| } | |
| } | |
| function safeCall(f) { | |
| var args = []; | |
| for (var a = 1; a < arguments.length; ++a) | |
| args.push(arguments[a]); | |
| try { | |
| return f.apply(this, args); | |
| } catch (ex) { | |
| echo(ex); | |
| } | |
| } |