Le 10/02/2013 20:27, Gustavo Lopes a écrit :

> This was I was afraid. That bug was just the tip of the iceberg. I
> suggest we do change the the > operator to >= like you proposed, 

I will do it later today.

> but  also that we add the fmod call. The code I gave earlier had a bug btw,
> as fmod can give a negative number. I changed it to this:
> 
> long convert(double d)
> {
>     double dmod = fmod(d, pow(2., 64.));
>     if (dmod < 0) {
>         dmod += pow(2., 64.);
>     }
>     return (long)(unsigned long)dmod;
> }
> 
> I tested the doubles around -4e21 and it worked fine:

On ppc64,

$ gcc -O2 -Wall conv.c -o conv -lm

$ ./conv -4000000000000001048576
2943463994971652096 -9223372036854775808
$ ./conv  -4000000000000000524288
2943463994972176384 -9223372036854775808
$ ./conv -4000000000000000000000
2943463994972700672 -9223372036854775808
$ ./conv -3999999999999999475712
2943463994973224960 -9223372036854775808
$ ./conv -3999999999999998951424
2943463994973749248 -9223372036854775808

$ ./conv 9223372036854775808
-9223372036854775808 -9223372036854775808
$ ./conv 4e21
-2943463994972700672 -1
$ ./conv 4e19
3106511852580896768 -1

> 
> $ ./a.out -4000000000000001048576
> 2943463994971652096 -9223372036854775808
> $ ./a.out -4000000000000000524288
> 2943463994972176384 -9223372036854775808
> $ ./a.out -4000000000000000000000
> 2943463994972700672 -9223372036854775808
> $ ./a.out -3999999999999999475712
> 2943463994973224960 -9223372036854775808
> $ ./a.out -3999999999999998951424
> 2943463994973749248 -9223372036854775808
> 
> In[36]:= c /@ Table[-4.*^21 + i*Ulp[-4.*^21], {i, -2, 2}]
> 
> Out[36]= {2943463994971652096, 2943463994972176384, \
> 2943463994972700672, 2943463994973224960, 2943463994973749248}
> 
> Any reservations?

For which values ? Outside LONG_MIN .. ULONG_MAX ?

Remi.


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to