About
http://git.php.net/?p=php-src.git;a=commitdiff;h=79956330fe17cfd5f60de456497541b21a89bddf
(For now, I have reverted this fix)
Here some explanations.
LONG_MAX is 9223372036854775807 (0x7fffffffffffffff)
double representation of LONG_MAX is 9223372036854775808
(d > LONG_MAX) is evaluated in double space.
So is false for double which have the same value than (double)LONG_MAX.
So, for (double)LONG_MAX the cast used is
(long)d
9223372036854775807 on ppc64
9223372036854775808 on x86_64 (gcc without optimization)
9223372036854775807 on x86_64 (gcc -O2)
PHP expected value is 9223372036854775808
(Btw, I don't understand why PHP, build on x86_64, with -O2, gives the
good result, some environment mystery)
Obviously, we could have different result on different platform,
compiler, architecture.
I will be very interested by result on other platform (mac, windows),
compiler (Visual C), architecture.
If we switch to the unsigned cast:
(long)(unsigned long)d;
The result is always 9223372036854775808 (which is expected)
So my proposal, is to use the unsigned cast for (double)LONG_MAX value.
- if (d > LONG_MAX) {
+ if (d >= LONG_MAX) {
>From my tests, this doesn't change anything on x86_64, and improves
ppc64 (same result, so at least 9 unit tests succeed)
Any comments ?
If you agree, I will apply this patch again.
Regards,
Remi
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php