-1

(この質問は Ruby のコンテキストで尋ねられますが、より一般的な方法で回答されたとしても動揺しません。)

したがって、数学計算に含まれる浮動小数点数が等しいかどうかを比較することは禁止されており、範囲をテストする必要があることは (ほぼ) 誰もが知っています (Ruby のように):

assert_in_delta 5.0, 3.5+1.5, 0.0001

しかし、浮動小数点数が 1 つのサブシステムから別のサブシステムに渡されるとき、たとえば (Ruby のコンテキストで) 浮動小数点数が等しいかどうかを健全性チェックするときに、これはまだ必要なのでしょうか?

json={:foo => 0.5}.to_json
# POST the JSON to a Rails controller, that puts it in a Mongo database
found_obj=pull_obj_out_of_Mongo # details not important here
assert_in_delta 0.5, found_obj[:foo], 0.0001

個人的には、ここでも assert_in_delta は良いアイデアだと思います。なぜなら、概念的な浮動小数点値 0.5 が、 equals を使用した浮動小数点リテラル 0.5。それは実際にそうですか、それとも浮動小数点数がどのように格納されて渡されるかについて偏執的すぎますか? 答えは、使用されている言語によってどの程度異なりますか?

4

1 に答える 1

0

これは、サブシステムがFloatで何をするかに大きく依存します。Ruby(少なくとも1.8および1.9)では、Floatは倍精度数を単純にラップします(文字通りCで、ほとんどの最新アーキテクチャではIEEE 754倍精度数doubleとして格納されます)。数値を渡したり、その表現でコピーしたりしても、ビットは変更されません。

ただし、Floatをサブシステムに渡すと、基になる表現が変更される場合があります。与えた例では、JSONを使用して数値をシリアル化しています。これには、floatを文字列に変換してから、元に戻すことが含まれます。15〜16桁を超える精度が回復するという保証はありません(その精度で変換したと仮定した場合)。これは多くのように思えますが、すべての可能な浮動小数点値を厳密に等しくするだけでは十分ではありません。

于 2012-08-03T03:33:24.663 に答える