<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="">oh, also i'm not a tc39 member if i made it sound like i was ^^;;;<div class=""><br 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;">kai zhu</div><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;"><a href="mailto:kaizhu256@gmail.com" class="">kaizhu256@gmail.com</a></div><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><br class="Apple-interchange-newline">
</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On 29 May 2018, at 1:43 AM, kai zhu <<a href="mailto:kaizhu256@gmail.com" class="">kaizhu256@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">hi fabrice, what you’ve done is interesting and impressive;  but an integration-level concern (if tc39 is to consider standardizing your extension, rather than keep it userland) is how would a web-project go about baton-passing these arbitrary-precision numbers between browser <-> server <-> persistent-storage via JSON?  what would happen if you pass an arbitrarily large float as a “number” type to current mysql (or native-module sqlite3) driver?<div class=""><br class=""></div><div class="">playing with your live web-demo @ <a href="http://numcalc.com/" class="">http://numcalc.com/</a>, it seems JSON.stringify has divergent behavior between math-equivalent large floats (preserves full-precision) and large integers (throws error as a bigint):</div><div class=""><br class=""></div><div class=""><font face="Courier" size="1" class="">```js</font></div><div class=""><font face="Courier" size="1" class="">mjs > </font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890.0e0 === </span><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span></div><div class=""><span style="font-family: Courier; font-size: x-small;" class="">true</span></div><div class=""><span style="font-family: Courier; font-size: x-small;" class=""><br class=""></span></div><div class=""><font face="Courier" size="1" class="">mjs > typeof </font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890.0e0</span></div><div class=""><span style="font-family: Courier; font-size: x-small;" class="">"number"</span></div><div class=""><div class=""><font face="Courier" size="1" class="">mjs > JSON.stringify(</font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890.0e0</span><span style="font-family: Courier; font-size: x-small;" class="">)</span></div><div class=""><font face="Courier" size="1" class="">"</font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><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="">mjs > typeof </font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span></div><div class=""><span style="font-family: Courier; font-size: x-small;" class="">"bigint"</span></div><div class=""></div><div class=""><font face="Courier" size="1" class="">mjs > JSON.stringify(</font><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><span style="font-family: Courier; font-size: x-small;" class="">1234567890</span><font face="Courier" size="1" class="">)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">TypeError: bigint are forbidden in JSON.stringify</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at to_str (stdlib.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at stringify (stdlib.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at &lt;eval> (&lt;evalScript>)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at evalScript (native)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at eval_and_print (repl.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at setPrec (native)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at handle_cmd (repl.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at readline_handle_cmd (repl.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at handle_key (repl.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at handle_char (repl.js)</font></div><div class=""><font face="Courier" size="1" color="#ff2600" class="">    at handle_byte (repl.js)</font></div><div class=""><font face="Courier" size="1" class=""><br class=""></font></div><div class=""><div class=""><span style="font-family: Courier; font-size: x-small;" class="">mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e123456))</span></div></div><div class=""><font face="Courier" size="1" class=""><div class="">1.12345678901234567890123456789e+123456 <font color="#ff2600" class="">// takes ~200ms to process</font></div><div class=""><br class=""></div></font></div><div class=""><font face="Courier" size="1" class=""><div class="">mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e-123456))</div><div class="">1.12345678901234567890123456789e-123456 <font color="#ff2600" class="">// takes ~200ms to process</font></div><div class=""><br class=""></div></font></div><div class=""><font face="Courier" size="1" class="">mjs > JSON.stringify(1.1e1234567890) <font color="#ff2600" class="">// unresponsive</font></font></div></div><div class=""><font face="Courier" size="1" class=""><br class=""></font></div><div class=""><span style="font-family: Courier; font-size: x-small;" class="">mjs > JSON.stringify(1.1e-1234567890) <font color="#ff2600" class="">// unresponsive</font></span></div><div class=""><font face="Courier" size="1" class="">```</font></div><div class=""><br class=""><div class="">
<div 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="">kai zhu</div><div 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="mailto:kaizhu256@gmail.com" class="">kaizhu256@gmail.com</a></div><div 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 class=""></div><br class="Apple-interchange-newline">
</div>
<br class=""><div class=""><blockquote type="cite" class=""><div class="">On 28 May 2018, at 7:25 PM, Fabrice Bellard <<a href="mailto:fabrice@bellard.org" class="">fabrice@bellard.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">A new revised version of the "BigNum extensions" is available at <a href="http://numcalc.com/jsbignum.pdf" class="">http://numcalc.com/jsbignum.pdf</a> . This new version is 100% compatible with standard Javascript with the addition of a "use bigint" mode. It is split into 4 proposals:<br class=""><br class="">1) Overloading of the standard operators to support new types such as complex numbers, fractions or matrixes.<br class=""><br class="">2) Bigint mode where arbitrarily large integers are available by default (no "n" suffix is necessary as in the BigInt proposal at <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 754 semantics.<br class=""><br class="">4) Optional "math" mode which modifies the semantics of the division, modulo and power operator. The division and power operator return a fraction with integer operands and the modulo operator is defined as 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 "\mode [std|bigint|math]" can be used to switch between the standard javascript mode, bigint mode or math mode. In standard Javascript mode, the complete TC39 BigInt proposal is supported. In the demo, the default<br class="">floating point precision is set to 128 bits. It can be set back to the 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><br class=""><a href="https://mail.mozilla.org/listinfo/es-discuss" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class=""></div></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div></body></html>