On Sun, 10 Feb 2013 16:19:46 +0100, Remi Collet <r...@fedoraproject.org>
wrote:
Le 10/02/2013 15:58, Gustavo Lopes a écrit :
Can you test this program on ppc64:
$ gcc -O3 -lm conv.c && ./a.out 9223372036854775808
-9223372036854775808 -9223372036854775808
$ gcc -O3 -lm conv.c && ./a.out 4e21
-2943463994972700672 -1
$ gcc -O3 -lm conv.c && ./a.out 4e19
3106511852580896768 -1
I get this:
$ gcc -O3 -lm conv.c && ./a.out 9223372036854775808
-9223372036854775808 -9223372036854775808
$ gcc -O3 -lm conv.c && ./a.out 4e21
-2943463994972700672 0
$ gcc -O3 -lm conv.c && ./a.out 4e19
3106511852580896768 0
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, 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:
$ ./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?
--
Gustavo Lopes
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php