<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">@anders, i'm just brainstorming if JSON could meet most of industry-needs for large-numbers (with minimal changes), if</div><div class=""><br class=""></div><div class="">1. JSON.stringify was enhanced to stringify fixed-precision BigInt64 and BigDecimal128 as strings (including suffix to make userland parsing easier)</div><div class=""><br class=""></div><div class="">2. JSON.parse is left untouched</div><div class=""><br class=""></div><div class=""><font face="Courier" size="1" class="">```js</font></div><div class=""><div class=""><font face="Courier" size="1" class="">state = {</font></div><div class=""><font face="Courier" size="1" class="">    "bigInt64": -9223372036854775807n,</font></div><div class=""><font face="Courier" size="1" class="">    "bigDecimal128": -9.99999999999999999999999999999999e6144dd</font></div><div class=""><font face="Courier" size="1" class="">}</font></div><div class=""><font face="Courier" size="1" class=""><br class=""></font></div><div class=""><font face="Courier" size="1" class="">// JSON.stringify will stringify BigInt64 and BigDecimal128 as <font color="#ff2600" class="">strings</font></font></div><div class=""><font face="Courier" size="1" class="">JSON.stringify(state) = '{\</font></div><div class=""><font face="Courier" size="1" class="">    "bigInt64": "-9223372036854775807n",\</font></div><div class=""><font face="Courier" size="1" class="">    "bigDecimal128": "-9.99999999999999999999999999999999e6144dd"\</font></div><div class=""><font face="Courier" size="1" class="">}'</font></div><div class=""><font face="Courier" size="1" class=""><br class=""></font></div><div class=""><font face="Courier" size="1" class="">// JSON.parse will <font color="#ff2600" class="">NOT un-stringify</font> BigInt64 and BigDecimal128 (userland responsibility)</font></div><div class=""><font face="Courier" size="1" class="">JSON.parse(JSON.stringify(state)) = {</font></div><div class=""><font face="Courier" size="1" class="">    "bigInt64": <font color="#ff2600" class="">"-9223372036854775807n"</font>,</font></div><div class=""><font face="Courier" size="1" class="">    "bigDecimal128": <font color="#ff2600" class="">"-9.99999999999999999999999999999999e6144dd"</font></font></div><div class=""><font face="Courier" size="1" class="">}</font></div></div><div class=""><font face="Courier" size="1" class="">```</font></div><div class=""><div class=""><div class=""><div class=""><div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class=""><br class=""></div></div><br class=""><div><blockquote type="cite" class=""><div class="">On 29 May 2018, at 12:22 PM, Anders Rundgren <<a href="mailto:anders.rundgren.net@gmail.com" class="">anders.rundgren.net@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On 2018-05-28 21:05, Fabrice Bellard wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">Hi,<br class="">JSON.stringify is currently fully compatible with the TC39 BigInt<br class="">proposal, so it throws an exception in the case of a bigint value. You<br class="">can add:<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I haven't looked into the BigInt proposal but if it breaks I-JSON/JSON.parse()</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I would vote against it.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">The JSON community is unfortunately already pretty confused and divided:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://github.com/cyberphone/I-JSON-Number-System#existing-solutions" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://github.com/cyberphone/I-JSON-Number-System#existing-solutions</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Microsoft's JSON/.NET guru's view on JSON.parse():</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://github.com/JamesNK/Newtonsoft.Json/issues/1706#issuecomment-390514965" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://github.com/JamesNK/Newtonsoft.Json/issues/1706#issuecomment-390514965</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Anders</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">BigInt.prototype.toJSON = function() { return this.toString(); }<br class="">to handle this case. It could also be possible to modify the behavior of<br class="">JSON.stringify in bigint mode so that it does not throw an exception in<br class="">case of a bigint value.<br class="">Regarding the unresponsive cases you noticed with large exponents in<br class="">floating point literals, it is a known problem of the current code which<br class="">will be corrected.<br class="">Best regards,<br class="">Fabrice.<br class="">On 05/28/2018 07:43 PM, kai zhu wrote:<br class=""><blockquote type="cite" class="">hi fabrice, what you’ve done is interesting and impressive;  but an<br class="">integration-level concern (if tc39 is to consider standardizing your<br class="">extension, rather than keep it userland) is how would a web-project go<br class="">about baton-passing these arbitrary-precision numbers between browser<br class=""><-> server <-> persistent-storage via JSON?  what would happen if you<br class="">pass an arbitrarily large float as a “number” type to current mysql (or<br class="">native-module sqlite3) driver?<br class=""><br class="">playing with your live web-demo @ <a href="http://numcalc.com/" class="">http://numcalc.com/</a>, it seems<br class="">JSON.stringify has divergent behavior between math-equivalent large<br class="">floats (preserves full-precision) and large integers (throws error as a<br class="">bigint):<br class=""><br class="">```js<br class="">mjs > 12345678901234567890.0e0 === 12345678901234567890<br class="">true<br class=""><br class="">mjs > typeof 12345678901234567890.0e0<br class="">"number"<br class="">mjs > JSON.stringify(12345678901234567890.0e0)<br class="">"12345678901234567890”<br class=""><br class="">mjs > typeof 12345678901234567890<br class="">"bigint"<br class="">mjs > JSON.stringify(12345678901234567890)<br class="">TypeError: bigint are forbidden in JSON.stringify<br class="">    at to_str (stdlib.js)<br class="">    at stringify (stdlib.js)<br class="">    at &lt;eval> (&lt;evalScript>)<br class="">    at evalScript (native)<br class="">    at eval_and_print (repl.js)<br class="">    at setPrec (native)<br class="">    at handle_cmd (repl.js)<br class="">    at readline_handle_cmd (repl.js)<br class="">    at handle_key (repl.js)<br class="">    at handle_char (repl.js)<br class="">    at handle_byte (repl.js)<br class=""><br class="">mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e123456))<br class="">1.12345678901234567890123456789e+123456 // takes ~200ms to process<br class=""><br class="">mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e-123456))<br class="">1.12345678901234567890123456789e-123456 // takes ~200ms to process<br class=""><br class="">mjs > JSON.stringify(1.1e1234567890) // unresponsive<br class=""><br class="">mjs > JSON.stringify(1.1e-1234567890) // unresponsive<br class="">```<br class=""><br class="">kai zhu<br class=""><a href="mailto:kaizhu256@gmail.com" class="">kaizhu256@gmail.com</a><span class="Apple-converted-space"> </span><<a href="mailto:kaizhu256@gmail.com" class="">mailto:kaizhu256@gmail.com</a>><br class=""><br class=""><br class=""><br class=""><blockquote type="cite" class="">On 28 May 2018, at 7:25 PM, Fabrice Bellard <<a href="mailto:fabrice@bellard.org" class="">fabrice@bellard.org</a><br class=""><<a href="mailto:fabrice@bellard.org" class="">mailto:fabrice@bellard.org</a>>> wrote:<br class=""><br class="">A new revised version of the "BigNum extensions" is available at<br class=""><a href="http://numcalc.com/jsbignum.pdf" class="">http://numcalc.com/jsbignum.pdf</a> . This new version is 100% compatible<br class="">with standard Javascript with the addition of a "use bigint" mode. It<br class="">is split into 4 proposals:<br class=""><br class="">1) Overloading of the standard operators to support new types such as<br class="">complex numbers, fractions or matrixes.<br class=""><br class="">2) Bigint mode where arbitrarily large integers are available by<br class="">default (no "n" suffix is necessary as in the BigInt proposal at<br class=""><a href="https://tc39.github.io/proposal-bigint/" class="">https://tc39.github.io/proposal-bigint/</a> ).<br class=""><br class="">3) Arbitrarily large floating point numbers in base 2 using the IEEE<br class="">754 semantics.<br class=""><br class="">4) Optional "math" mode which modifies the semantics of the division,<br class="">modulo and power operator. The division and power operator return a<br class="">fraction with integer operands and the modulo operator is defined as<br class="">the Euclidian remainder.<br class=""><br class="">A complete demo is available at <a href="http://numcalc.com" class="">http://numcalc.com</a> . The command<br class="">"\mode [std|bigint|math]" can be used to switch between the standard<br class="">javascript mode, bigint mode or math mode. In standard Javascript<br class="">mode, the complete TC39 BigInt proposal is supported. In the demo, the<br class="">default<br class="">floating point precision is set to 128 bits. It can be set back to the<br class="">default Javascript precision with "\p f64" or "\p 53 11".<br class=""><br class="">Fabrice.<br class="">_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><span class="Apple-converted-space"> </span><<a href="mailto:es-discuss@mozilla.org" class="">mailto:es-discuss@mozilla.org</a>><br class=""><a href="https://mail.mozilla.org/listinfo/es-discuss" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class=""></blockquote><br class=""></blockquote>_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class=""><a href="https://mail.mozilla.org/listinfo/es-discuss" class="">https://mail.mozilla.org/listinfo/es-discuss</a></blockquote></div></blockquote></div><br class=""></div></div></div></body></html>