ホームページ  >  記事  >  バックエンド開発  >  PHP における不等浮動小数点小数点現象の深い理解

PHP における不等浮動小数点小数点現象の深い理解

WBOY
WBOYオリジナル
2024-03-08 16:00:05282ブラウズ

PHP における不等浮動小数点小数点現象の深い理解

PHP は Web 開発で広く使用されているプログラミング言語ですが、浮動小数点数の処理は常に開発者が注意を払う必要がある問題です。実際の開発では、浮動小数点数が等しくないという現象によく遭遇しますが、これはコンピュータ内の浮動小数点数のバイナリ形式による精度の低下が原因であることがよくあります。この記事では、PHP の浮動小数点不等式を深く掘り下げ、具体的なコード例で説明します。

まず、簡単な例から始めましょう。 2 つの浮動小数点数 $a = 0.1 0.2$ と $b = 0.3$ があるとします。これら 2 つの数値は等しいはずですが、実際のプログラミングでは等しくない可能性があります。次のコードで検証してみましょう:

$a = 0.1 + 0.2;
$b = 0.3;

if ($a == $b) {
    echo "相等";
} else {
    echo "不相等";
}

上記のコードを実行すると、出力結果が「等しくない」ことがわかります。これは、コンピュータでは 0.1、0.2、0.3 という数値が 2 進数で表現されると無限に繰り返される 10 進数であるため、完全に正確に表現することができないためです。 $a = 0.1 0.2$ を計算するときにわずかなエラーが発生し、その結果、$a$ の値は実際には 0.3 に非常に近い数値になりましたが、正確には 0.3 には等しくありませんでした。

この問題をより深く理解するために、別の例を見てみましょう。次のコードを考えてみましょう:

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
if ($x == $y) {
    echo "相等";
} else {
    echo "不相等";
}

上記のコードを実行すると、出力結果が「等しくない」ことがわかります。これは、同じ理由で、コンピュータでは 0.1 を正確に表すことができず、$y$ は実際には 0.7 よりわずかに大きい数値になるためです。したがって、$x$ と $y$ の値は等しいはずだと予想されますが、浮動小数点精度の制限により、実際には等しくありません。

この問題を解決するには、通常、等価演算子を直接使用するのではなく、誤差範囲を使用して浮動小数点数を比較します。たとえば、上記のコードを次のように変更できます。

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
$epsilon = 0.00001; // 定义一个误差范围

if (abs($x - $y) < $epsilon) {
    echo "相等";
} else {
    echo "不相等";
}

許容誤差範囲を導入することで、浮動小数点数をより柔軟に比較できるようになり、精度の問題によって引き起こされる不平等を回避できます。

つまり、浮動小数点数が等しくないという現象は PHP でよくある問題であり、浮動小数点数のバイナリ表現による精度の低下のため、開発者はこの状況の処理に注意する必要があります。誤差範囲を合理的に設定するか、他の処理方法を採用することにより、浮動小数点数の不等比較の問題を効果的に解決して、プログラムの正確性と安定性を確保できます。

以上がPHP における不等浮動小数点小数点現象の深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。