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