> [2012-04-11 07:47 UTC] foobla at spambog dot com > I don't think it's about PHP_MAX_INT, rather about the maximum precision of a double/float. "==" converts both strings to numbers (after spending CPU cycles to detect whether they look like numbers), as described in http://www.phpsadness.com/sad/47 [phpsadness.com] > > once converted, the floats seem to actually *be* equal, even with "===": > > php -r ' > $a = (double)"9223372036854775807"; > $b = (double)"9223372036854775808"; > var_dump($a, $b, $a == $b, $a === $b); > ' > float(9.2233720368548E+18) > float(9.2233720368548E+18) > bool(true) > bool(true)
===を使えば良いだけのような (スコア:0)
その辺が問題になるようなプログラムなら===を使っているだろうし実害はない気がする。
Re:===を使えば良いだけのような (スコア:2, すばらしい洞察)
浮動小数点数を直接比較して等しいかどうかを調べてはいけません
Re: (スコア:0)
それが正しいと思うのに
なんでみんな文句言ってるんだ?
Re: (スコア:0)
文字列同士の比較の話だから
Re: (スコア:0)
PHP を使う人たちは
(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1) == 1.0
がtrueにならないと騒ぐ人が多くていまでも不思議な演算が == ではされている。
俺の思った比較じゃないと思う人が多ければその人たちの為に演算結果が変わるのが
PHP じゃないかと思う。
Re: (スコア:0)
(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1) = 1.0 になるのはCOBOLの常識!
Re: (スコア:0)
なんか、このサイトひどくレベルが低いな。
コンピューターの浮動小数というのは近似値でしかない。
近似値を数学的等号で検査することには意味がない
だからやるな。
それだけなんだが。
#もう少し待てば大富豪が現れて近似誤差も含めて等しいか判定する処理系をつくってくれるだろうからそれまで待て
##できればその間ITとか関係ないことをやっていてくれ
Re: (スコア:0)
精度保証付き計算を直接サポートした処理系が出てくれば問題は解決されるかもしれない
Re: (スコア:0)
じゃぁ、どうして == は、それを試みるのか?
Re:===を使えば良いだけのような (スコア:1)
> [2012-04-11 07:47 UTC] foobla at spambog dot com
> I don't think it's about PHP_MAX_INT, rather about the maximum precision of a double/float. "==" converts both strings to numbers (after spending CPU cycles to detect whether they look like numbers), as described in http://www.phpsadness.com/sad/47 [phpsadness.com]
>
> once converted, the floats seem to actually *be* equal, even with "===":
>
> php -r '
> $a = (double)"9223372036854775807";
> $b = (double)"9223372036854775808";
> var_dump($a, $b, $a == $b, $a === $b);
> '
> float(9.2233720368548E+18)
> float(9.2233720368548E+18)
> bool(true)
> bool(true)
ということで、実害ありそうな。
なお、perl でやってみたところ、
$a == $b は true、$a eq $b は(当然)false でした。
問題の本質は、== を文字比較に使用しているところでしょう。
Re:===を使えば良いだけのような (スコア:1)
doubleにキャストしてしまってる時点でダメなんじゃないの?
その後どうしようがキャストした時点で値が違うんだから、==による暗黙の型変換なんか意味がない。
ちなみにうちではこうなった。
$ php -v
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15)
$ php -r '
> $a = "9223372036854775807";
> $b = "9223372036854775808";
> var_dump($a, $b, $a == $b, $a === $b);
> '
string(19) "9223372036854775807"
string(19) "9223372036854775808"
bool(false)
bool(false)
$php -r "var_dump('9223372036854775807'=='9223372036854775808');"
bool(false)
$ php -r "var_dump('9999999999999999999.0' == '9999999999999999999.1');"
bool(true)
$ php -r '
> $a = "9999999999999999999.0";
> $b = "9999999999999999999.1";
> var_dump($a == $b, $a === $b);
> '
bool(true)
bool(false)
Re:===を使えば良いだけのような (スコア:1)
ええ。
内部的にdoubleにキャストしているため
== と === で変化がない、という意味です。
Re:===を使えば良いだけのような (スコア:1)
普通ならそうだと思う。
だが、「PHPプログラマを舐めるな!」と私は言いたい。
そんな常識が奴らには通用しないから。
そもそも、それらの演算子があることを知ってるかどうか……。orz
Re: (スコア:0)
何が入ってくるか判らないのならstrcmpが無難じゃないかな。
桁溢れしそうソートなら
usort($a, 'bccomp');
にすれば良いだけだしなぁ。
Re:===を使えば良いだけのような (スコア:3, 参考になる)
strcmp は「なんかよく分からない値→文字列」の変換をかましてから、文字列同士を比較するので、変換で何が起きるかをきちんと把握していていない限り使っちゃダメ、だそうです。
上記記事では、 pow(2,52) と pow(2,52)+10 が strcmp では同一と判定されてしまう、という例が示されています。結論としては === を使え、ということのようです。
Re: (スコア:0)
memcmpないの?
Re: (スコア:0)
JavaScriptでも、たまにこれしないでバグになる。