Re: Conversion of ES Number to WebIDL long long and unsigned long long should not throw by default

On Wed, Feb 8, 2012 at 5:28 AM, Boris Zbarsky <bzbarsky@mit.edu> wrote:

> The current WebIDL algorithm for long long says:
>
>  Set x to sign(x) * floor(abs(x)).
>  Set x to x modulo 2^64.
>  If x is greater than or equal to 2^63, then set x to x - 2^64.
>  If x < -(2^53 - 1) or x > 2^53 - 1, then throw a TypeError.
>
> This makes no sense.  The justification is something about how your x
> might have lost precision and so you may not be hitting the 64-bit int you
> "wanted"... but in that case the check-and-throw should be done before
> reduction mod 2^64.  Doing it after just means the result is somewhat
> random once your double is greater than 2^64.
>

The purpose of the third step is to adjust sign, I'd say. See the
definition of modulo in the ES spec (preserves sign of the divisor) +
compare the above to ToInt32()'s definition.

--sof

Received on Monday, 13 February 2012 08:35:05 UTC