fmod() in PHP is the worst !”#¤%&/()= function ever!
November 10th, 2009 | by David |I hate floating point artithmetic and I really hate fmod() in PHP. It’s useless.
fmod — Returns the floating point remainder (modulo) of the division of the arguments
If you calculate 36 modulo 7.2? What do you get? Zero, yes. 7.2*5=36. No remainder!
What if you use fmod in PHP?
$ php -r 'echo fmod(36,7.2);'
7.2
WTF? Excuse me? Is that the result from IEEE 754 hell, a parallel universe, or what?
Now I’m betting on the function below. I hope it won’t let me down.
function modulo($n,$b) {
return $n-$b*floor($n/$b);
}
2 Responses to “fmod() in PHP is the worst !”#¤%&/()= function ever!”
By Carl Ådahl on Nov 11, 2009 | Reply
Could it be possible that ‘echo’ is truncating the value? E.g. printing 7.199999999999 as 7.2.
Then you have the problem of exact representability of course. Did you try this in C/C#/Java?
By David on Nov 11, 2009 | Reply
@Carl
Indeed:
$ php -d precision=40 -r ‘echo fmod(36,7.2);’
7.199999999999999289457264239899814128876
So, fmod() actually thinks that 36 is 4*7.2 + the above?