Thanks for all the feedback, 

My questions and the title of this thread should probably be rephrased, I
understand now that changing the "float comparison" would be a "fatal flaw
in the language" and apologies for ever mentioning it.

Before I ask any other questions, I would like to understand how
float->string conversion works:

php -dprecision=100 -r 'echo 0.3,"\n";' 
0.299999999999999988897769753748434595763683319091796875
php -dprecision=8 -r 'echo 0.3,"\n";'   
0.3
php -dprecision=8 -r 'echo 0.3*0.075,"\n";' 
0.0225

I have checked out PHP from CVS and I'm looking at zend_operators.c :
convert_to_double(zval *op) Is this the right place?

This question stems from a scenario I see often, some programmers using PHP
to do accounting and the result is often well, let's say things are not what
they would expect (not all PHP programmers have a CS degree). 

Bcmath does solve the problem, but maybe there's room for improving how PHP
could natively compare and manipulate decimals with limited precision (i.e.
currency, taxes etc..). The fact that frameworks need workarounds (i.e.
Zend_Locale_Math) is an indicator that it's an important use case for the
community... 

If someone could point me to the float->string code, I'd really appreciate

j

-----Original Message-----
From: Marcus Boerger [mailto:[EMAIL PROTECTED] 
Sent: May 4, 2008 7:06 AM
To: Todd Ruth
Cc: internals@lists.php.net
Subject: Re: [PHP-DEV] Float comparison

Hello Todd,

  please read that article to get at least a minimum understanding of what
float values are. Speaking of comparisons and floating point values you
might want to consider using fixed point values. That is you decide how
many digits you want for your fractions. Another option is to use two ints
to present numbers (numerator/denominator). The third solution is to always
round (but then the float rules apply again to some extend). The forth
solution is to do BCD arithmetics which might be a bit slower even.

Maybe you should have a look into PHP's bcmath extension.

Anyway, just to get this straight. The comparison operators work indeed
perfectly for float values. They just don't lead to the results you might
expect. And that is in fact a result from their design. And that design is
used in all modern CPUs. The ways out are mentioned above and interstingly
some high end processors even support one or the other in silicon.

marcus

Friday, May 2, 2008, 7:36:33 PM, you wrote:

> I'm afraid you'll find Pierre's response representative.  The
> php devs seem to consider the fact that a theoretically perfect
> "==" doesn't exist to mean that the improvements that would 
> cover 99.9% of user issues with float == shouldn't be made.

> It could be worse, however.  At least the cast to string works
> as one would expect.  Just imagine if those who oppose
> improving "==" had their logic extended to the cast to string.
> Php might to the following:

> <?php
> $x=.3+.4+.5;
> print "$x\n";
?>>

> might output "1.19999999999999996447286321199499070644378662109375"

> If someone filed a bug report, they could refer you to that
> paper and tell you there's no bug because you're trying to get
> a string from float and you never know what you might get.
> So we can at least be glad that casts to string work as the
> average person would expect.  We can hope that someday the
> fact that the cast to string works as expected will inspire
> them believe that making "==" work as expected wouldn't be 
> a bad thing.

> Seriously though, the biggest issue I see with improving "=="
> is the implication for other features.  For example, what
> should the following code do?

> $a[.3+.4+.5] = "hello";
> print isset($a[1.2])

> Should floats be allowed as array indices?  I would say no because
> I'd rather floats be converted to strings before being used as
> array indices.  That would make the above code work as the
> average person would expect.  Unfortunately, that would be a huge
> BC break.  However, perhaps the perfect shouldn't be the enemy of
> the good and we shouldn't let the inability to fix floats as
> array indices be a reason not to improve "==".

> - Todd

> On Fri, 2008-05-02 at 19:04 +0200, Pierre Joye wrote:
>> On Fri, May 2, 2008 at 6:52 PM, Jonathan Bond-Caron <[EMAIL PROTECTED]>
wrote:
>> > Hi,
>> >
>> >
>> >
>> >  I'm new to the PHP internals list and I'm posting an issue I'm sure
has been
>> >  mentioned before -- float comparison
>> >
>> >
>> >
>> >  I'd like to know if there are reasons not to change the default
behavior
>> >  when comparing floats.
>> >
>> >
>> >
>> >  i.e. This would seem logical to me:
>> >
>> >
>> >
>> >                 $test = 19.6*100;
>> >
>> >                 if((float)(string)$test == (double)1960)
>> >
>> >                                 echo "GOOD BEHAVIOR";
>> >
>> >
>> >
>> >                 // Implicitely convert the float to string then float
(en_US
>> >  locale)
>> >
>> >                 if($test == (double)1960)
>> >
>> >                                 echo "THIS SHOULD PASS by casting
>> >  (float)(string)$test internally...";
>> >
>> >                 else
>> >
>> >                                 echo "NOT GOOD BEHAVIOR";
>> >
>> >
>> >
>> >                 // Exact comparison would still fail
>> >
>> >                 if($test !== (double)1960)
>> >
>> >                                 echo "GOOD BEHAVIOR";
>> >
>> >
>> >
>> >  Any reason why $test == (double)1960 should fail? I realized we are
>> >  comparing two floats, but couldn't php internally convert to string
then
>> >  float - for the non strict (===) case
>> 
>> From our bug report:
>> "
>> Floating point values have a limited precision. Hence a value might
>> not have the same string representation after any processing. That also
>> includes writing a floating point value in your script and directly
>> printing it without any mathematical operations.
>> 
>> If you would like to know more about "floats" and what IEEE
>> 754 is read this:
>> http://docs.sun.com/source/806-3568/ncg_goldberg.html
>> 
>> Thank you for your interest in PHP.
>> "
>> 
>> We use this text as automatic reply for bugs about floating points (aka
bogus).
>> 
>> Cheers,
>> -- 
>> Pierre
>> 
>> http://blog.thepimp.net | http://www.libgd.org
>> 




Best regards,
 Marcus



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to