I just had some time to spend reading the proposed draft of the new floating 
point spec.  It quickly became apparent that ES3.1 is far out of conformance 
with that draft and it would be a significant undertaking to update it to 
conform to the new standard.  In addition, doing so would introduce breaking 
incompatibilities into the language.


Here is a smattering of major issues.  The chapter and section numbers refer to 
the draft IEEE P754:

- Many, if not most, of the mandatory functions in chapter 5 are not 
implemented in ES3.1.  There are a lot that we'd also need to implement on 
binary floating-point numbers.

- IEEE P754 5.12.1 mandates that (decimal or binary) -0 print as "-0".  This is 
not going to happen.

- IEEE P754 5.12 mandates that binary floating-point numbers convert exactly to 
a string format with a hexadecimal mantissa and back.  An implementation must 
provide these conversions.


A few other tidbits about IEEE P754:

- There are many different ways of representing the same decimal number, which 
the standard calls a cohort.  Some numbers, such as zeroes, have thousands of 
different variants within the cohort.  Fortunately, printing a decimal number 
is not required to indicate which member of a cohort is chosen.  This avoids 
problems for us such as having the numbers x == y but a[x] and a[y] silently 
referring to different array elements (which is what would happen if we printed 
5.00m differently from 5.m).

- The standard now supports signed NaN's which are distinguishable from each 
other in various ways (total order predicate, isSignMinus, etc.).  There has 
been some talk about deferring to the IEEE spec instead of listing the 
permissible binary floating-point values explicitly as was done in ES3, but we 
must maintain something like the existing language to avoid getting into this 
quagmire.

- Implementors of the standard could not agree on the binary representation of 
decimal numbers.  There are two mutually incompatible ways of representing them 
-- the mantissa can be either a binary integer or an array of 10-bit groups, 
each representing three decimal digits.  I can't tell whether they behave 
differently in some scenarios -- if the format is wide enough, the integral 
representation can represent more values, and their handling of noncanonicals 
differs.

- Some parts of IEEE P754 are ambiguous.  For example, the notion of a 
subnormal is unclear when applied to decimal numbers.  It appears that you can 
have two equal values x and y of the same decimal format where x == y, x is 
subnormal, but y is not subnormal.


Some tidbits about our embedding of decimal:

- Contagion should be towards decimal if decimal and binary are mixed as 
operands.  5.3m + 1 should be 6.3m, not 6.3.  If we use 128-bit decimal, this 
also makes the behavior of heterogeneous comparisons (binary compared to 
decimal) sensible.

- We should not print the trailing zeroes.  IEEE P754 does not require it, and 
it breaks things such as array lookup.  There is precedence for this in 
ECMAScript:  -0 and +0 both print as "0".  If someone really wants to 
distinguish among equal numbers, he can do it with a function call to one of 
the mandated functions.

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

Reply via email to