boundaries.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. for (var numDigitsAfterDecimal = -1; numDigitsAfterDecimal <= 2; ++numDigitsAfterDecimal) {
  6. for (var lastDigit = 0; lastDigit <= (numDigitsAfterDecimal <= 0 ? 0 : 1); ++lastDigit) {
  7. for (var numDigits = 20; numDigits <= 23; ++numDigits) {
  8. var s = generateNumberString(numDigits - Math.max(0, numDigitsAfterDecimal), numDigitsAfterDecimal, lastDigit);
  9. echo(numDigits + " digits");
  10. echo(s);
  11. echo(eval(s).toString());
  12. echo("");
  13. }
  14. }
  15. }
  16. function generateNumberString(numDigitsBeforeDecimal, numDigitsAfterDecimal, lastDigit) {
  17. if (numDigitsBeforeDecimal < 1)
  18. throw new Error("Invalid numDigits");
  19. var useDecimal = numDigitsAfterDecimal >= 0;
  20. if (numDigitsAfterDecimal < 0)
  21. numDigitsAfterDecimal = 0;
  22. var s = "1";
  23. for (var i = 1; i < numDigitsBeforeDecimal; ++i)
  24. s += "0";
  25. if (useDecimal)
  26. s += ".";
  27. if (numDigitsAfterDecimal !== 0) {
  28. for (var i = 0; i < numDigitsAfterDecimal - 1; ++i)
  29. s += "0";
  30. s += lastDigit;
  31. }
  32. return s;
  33. }
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. function toString(o, quoteStrings) {
  36. switch (o) {
  37. case null:
  38. case undefined:
  39. return "" + o;
  40. }
  41. switch (typeof o) {
  42. case "boolean":
  43. case "number":
  44. {
  45. var s = "" + o;
  46. var e = s.indexOf("e");
  47. for (var i = (e == -1 ? s.length : e) - 3; i > 0; i -= 3)
  48. s = s.substring(0, i) + "," + s.substring(i);
  49. return s;
  50. }
  51. case "string":
  52. {
  53. var hex = "0123456789abcdef";
  54. var s = "";
  55. for (var i = 0; i < o.length; ++i) {
  56. var c = o.charCodeAt(i);
  57. if (c === 0)
  58. s += "\\0";
  59. else if (c >= 0x20 && c < 0x7f)
  60. s += quoteStrings && o.charAt(i) === "\"" ? "\\\"" : o.charAt(i);
  61. else if (c <= 0xff)
  62. s += "\\x" + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  63. else
  64. s += "\\u" + hex.charAt((c >> 12) & 0xf) + hex.charAt((c >> 8) & 0xf) + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  65. }
  66. if (quoteStrings)
  67. s = "\"" + s + "\"";
  68. return s;
  69. }
  70. case "object":
  71. case "function":
  72. break;
  73. default:
  74. return "<unknown type '" + typeof o + "'>";
  75. }
  76. if (o instanceof Array) {
  77. var s = "[";
  78. for (var i = 0; i < o.length; ++i) {
  79. if (i)
  80. s += ", ";
  81. s += toString(o[i], true);
  82. }
  83. return s + "]";
  84. }
  85. if (o instanceof Error)
  86. return o.name + ": " + o.message;
  87. if (o instanceof RegExp)
  88. return o.toString() + (o.lastIndex === 0 ? "" : " (lastIndex: " + o.lastIndex + ")");
  89. return "" + o;
  90. }
  91. function echo(o) {
  92. var s = toString(o);
  93. try {
  94. document.write(s + "<br/>");
  95. } catch (ex) {
  96. try {
  97. WScript.Echo(s);
  98. } catch (ex2) {
  99. print(s);
  100. }
  101. }
  102. }
  103. function safeCall(f) {
  104. var args = [];
  105. for (var a = 1; a < arguments.length; ++a)
  106. args.push(arguments[a]);
  107. try {
  108. return f.apply(this, args);
  109. } catch (ex) {
  110. echo(ex);
  111. }
  112. }