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

Reply via email to