1

なぜ次のコードが出力されるのか疑問に思います。

$a = log(5, 5);
$b = round(log(5, 5));
echo 'a: ';
var_dump($a);
echo '<br>';
echo 'b: ';
var_dump($b);
echo '<br>';
echo ($a == $b) ? 'equal' : 'not equal';

これ

a: float(1) 
b: float(1) 
not equal

これを私に説明できる人に感謝します。

4

1 に答える 1

7

PHPマニュアルの 浮動小数点数の章を引用するだけです。

警告浮動小数点の精度

浮動小数点数の精度には制限があります。システムによって異なりますが、PHPは通常IEEE 754倍精度形式を使用します。これにより、1.11e-16のオーダーの丸めにより、最大の相対誤差が発生します。非初等算術演算ではエラーが大きくなる可能性があります。もちろん、複数の演算が複合されている場合は、エラーの伝播を考慮する必要があります。

さらに、0.1や0.7のように、基数10の浮動小数点数として正確に表現できる有理数は、仮数のサイズに関係なく、内部で使用される基数2の浮動小数点数として正確に表現されません。したがって、精度を少し損なうことなく、対応する内部バイナリに変換することはできません。これにより、混乱を招く可能性があります。たとえば、floor((0.1 + 0.7)* 10)は、内部表現が7.9999999999999991118 ...のようになるため、通常、期待される8ではなく7を返します。

したがって、浮動小数点数の結果を最後の桁まで信頼しないでください。また、浮動小数点数を直接比較して等しいかどうかを確認しないでください。より高い精度が必要な場合は、任意精度の数学関数とgmp関数を使用できます。

于 2012-11-27T13:21:06.387 に答える