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?

playing with your live web-demo @ http://numcalc.com/ <http://numcalc.com/>, it 
seems JSON.stringify has divergent behavior between math-equivalent large 
floats (preserves full-precision) and large integers (throws error as a bigint):

```js
mjs > 12345678901234567890.0e0 === 12345678901234567890
true

mjs > typeof 12345678901234567890.0e0
"number"
mjs > JSON.stringify(12345678901234567890.0e0)
"12345678901234567890”

mjs > typeof 12345678901234567890
"bigint"
mjs > JSON.stringify(12345678901234567890)
TypeError: bigint are forbidden in JSON.stringify
    at to_str (stdlib.js)
    at stringify (stdlib.js)
    at &lt;eval> (&lt;evalScript>)
    at evalScript (native)
    at eval_and_print (repl.js)
    at setPrec (native)
    at handle_cmd (repl.js)
    at readline_handle_cmd (repl.js)
    at handle_key (repl.js)
    at handle_char (repl.js)
    at handle_byte (repl.js)

mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e123456))
1.12345678901234567890123456789e+123456 // takes ~200ms to process

mjs > JSON.parse(JSON.stringify(1.12345678901234567890123456789e-123456))
1.12345678901234567890123456789e-123456 // takes ~200ms to process

mjs > JSON.stringify(1.1e1234567890) // unresponsive

mjs > JSON.stringify(1.1e-1234567890) // unresponsive
```

kai zhu
[email protected]



> On 28 May 2018, at 7:25 PM, Fabrice Bellard <[email protected]> wrote:
> 
> A new revised version of the "BigNum extensions" is available at 
> http://numcalc.com/jsbignum.pdf . This new version is 100% compatible with 
> standard Javascript with the addition of a "use bigint" mode. It is split 
> into 4 proposals:
> 
> 1) Overloading of the standard operators to support new types such as complex 
> numbers, fractions or matrixes.
> 
> 2) Bigint mode where arbitrarily large integers are available by default (no 
> "n" suffix is necessary as in the BigInt proposal at 
> https://tc39.github.io/proposal-bigint/ ).
> 
> 3) Arbitrarily large floating point numbers in base 2 using the IEEE 754 
> semantics.
> 
> 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.
> 
> A complete demo is available at http://numcalc.com . 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
> 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".
> 
> Fabrice.
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to