problem with fmod()

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

•  Subject
• Author
• Posted on
Hi,

I have a problem with the function fmod.

Why is fmod(5.7, 0.1) = 0.1 ?? Why is it not 0?

tia bummerland

Re: problem with fmod()

bummerland@gmail.com wrote:

Hi,

Read the usercontributed notes on www.php.net for that function.
http://nl3.php.net/manual/en/function.fmod.php

It seems to be broken.
Also you'll find a few replacing algoritms.

Regards,
Erwin Moller

Re: problem with fmod()

On 29 Nov., 13:18, Erwin Moller

Thanks.

Re: problem with fmod()

bummerland@gmail.com wrote:

Because floating point arithmetic is not exact.  The number "5.7" cannot be
represented exactly in binary.  So, it's quite likely that you are really
computing something like fmod(5.69999999999999, 0.1), and that result would
be 0.09999999999999, which will print as 0.1.

It's not the function that is broken, I am afraid.  It is your
expectations.
--
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.

Re: problem with fmod()

Tim Roberts wrote:

Hi Tim,

The same thought crossed my mind.
But what is the use of fmod if it uses unexcact representations internally?
I mean, if you offer such a function, I would expect it does what it
claims to do (eg in their examples).
And thus NOT use 'normal' floating points representation, but something
that respects 6.0 as 6.0 and not 5.9999999999999.
(I must admit I don't know HOW, but I am sure some smart guy can figure
something out.)

Wouldn't it be better to dump fmod al together?
I mean, what to expect from the function?
What is your opinion?

Regards,
Erwin Moller

Re: problem with fmod()

Erwin Moller wrote:

Erwin,

It's a limitation of all floating point calculations.  And how can you
correct 5.99999999999 to 6.0 and not be sure the former was correct?

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

Re: problem with fmod()

Jerry Stuckle wrote:

Hi Jerry,

I am aware of the the problems concerning internal representation of
floating point numbers.

If I say to YOU 6.0 you know I don't say 5.999999999, right?
But if you are a computer you represent 6.0 to something that could
resemble 5.99999999 more than 6.0.

I just wonder why PHP offers fmod() while we all know it won't work in
many/most cases as expected because of internal floating point storage
(and thus changing values).

So, as far as I can see:
1) PHP shouldn't offer fmod() as it is now.
or
2) PHP should offer a fmod() that uses some other math behind the scenes.
Maybe with old fixed-point representation?
Not sure.
(Erwin is not a mathematician)
There must be libs that address this issue.

My main problem with fmod() is that it seems quite useless in its
current form.

Regards,
Erwin Moller

Re: problem with fmod()

Erwin Moller wrote:

Sure.  But that's how floating point calculations work.  How would the
computer know the answer wasn't actually 5.99999999?  It's outside the
available precision.  And the same problem occurs in C/C++'s fmod()
implementation.

Don't know.  I never found much good use for it anyway.  Didn't in
C/C++, either.

I wouldn't miss it.

Very difficult to do.  The first problem is both 5.7 and 0.1 cannot be
expressed in floating point.  So to do it with accuracy, they would have
to get rid of the IEEE implementation of floating point altogether and
go do packed decimal or similar.

And that will make all calculations much more difficult, because
processors will handle the IEEE format transparently, but (other than
IBM mainframes) won't do packed decimal.  So instead of one instruction
to do floating point add/subtract/multiply/divide, they would have to
have a whole routine to handle it.

Nope, no libs to handle it.  It's a restriction of floating point.

Just like in decimal - 10 / 3 * 3 = 9.999999999, and not 10.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================