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