0

浮動小数点の精度エラーの可能性があるため、PHP の浮動小数点数を直接比較すべきではないことを読みました。

浮動小数点数があり、浮動小数点数がどの範囲ブラケットに該当するかに応じて変数を設定する必要があります。このようなもの -

$mytext;

if ($myfloat < 5.5) {
  $mytext = "a";
} else if ($myfloat < 9.7) {
  $mytext = "b";
} else {
  $mytext = "c";
}

PHPでこれを行う正しい方法は何ですか?

4

1 に答える 1

0

浮動小数点数を等値演算子 (==または など!=) と比較しないようにアドバイスする人もいますが、このアドバイスは間違っています。等値演算子は、エラーなく正常に機能します。より良いアドバイスは、次のようなものです。浮動小数点算術演算 (型間の変換や「5.5」などの数値からの変換を含む) は、通常、丸め誤差を導入するため、浮動小数点演算の計算結果は通常、数学的に正確な結果とは異なります。近似浮動小数点でモデル化された 2 つの正確な値が等しいかどうかを判断したい場合は、次のようにする必要があります。

  • モデル化された値にどの程度の誤差があるかを判断します。
  • 浮動小数点エラーが原因で報告される正確な量がわずかに異なることを許容できるかどうか、および許容できる差の量 (偽陽性) を決定します。
  • 浮動小数点エラー (偽陰性) が原因で、正確に等しい金額が等しくないと報告されることを許容できるかどうかを判断します。

少なくとも、上記を見積もる必要があります。次に、偽陽性率と偽陰性率が許容できるほど低い結果を返す、実行できるテストがあるかどうかを判断します。一般に、人々は次のようなテストを使用fabs(a-b) < ErrorThresholdして、ErrorThreshold を推測します。

推測はエンジニアリングではありません。

上記は平等の場合です。順序の比較にも同様の懸念が適用されます (例:<または<=)。

あなたが示したサンプルの場合、問題は、5.5 と 9.7 の境界に非常に近い数値を特徴付けることにどれだけ関心があるかということです。枠より少し上か少し下の数字を正しい分類に入れて大丈夫ですか?その場合は、テストをそのまま使用してください。問題がある場合は、どの程度のエラーがあるかについての情報とともに、基準をさらに説明する必要$myfloatがあります。

于 2012-07-10T18:03:11.063 に答える