2017-01-21 33 views
6

私は単一値(または倍精度)の格納はあまり正確ではないことを知っています。たとえば125.12を格納すると、125.1200074788になります。今デルファイでは、パラメタとしてイプシロンをとり、125.1200074788、または例125.1200087952が等しいと言う、同じ値または比較値のような有用な関数です。単精度、倍精度、および精度

しかし、私はしばしばコードのようなものを見ています:もしaSingleVar = 0なら...そして、これは実際に私が常に仕事を見るように。どうして ?なぜ1つのvarにexemple 0を格納すると正確な値を保持しますか?

+0

ゼロは表現可能です。公差までの比較は簡単ですが、どのように公差を選んでいますか?あなたはアルゴリズムを理解する必要があります。アルゴリズムの知識なしに与えられた助言は、おそらく悪いアドバイスです。 –

答えて

9

浮動小数点変数には、m*2^e(mとeは整数)の値のみが格納されます(これらのすべてではありませんが、精度に依存します)。 0はこの形式を持ち、3128/25に等しいので、125.12はありません。1/25は、2の整数倍ではありません。

リテラル125.12は拡張精度数として扱われ、単一の(または二重)精度数は、このような値を持たないことになるので、単一(または二重)精度変数に125.12を比較すると、おそらく、常にFalse返します。

+0

これは、関数TRectf.IsEmpty:Booleanのデルファイ実装であることを意味しています。 begin 結果:=(右<=左)または(下<=上)。 end; 非常に正確でない場合は? – loki

+1

@ロキ問題はさまざまな種類の平等である。ここには<=と同じ型があります(右、左、上、下は同じタイプです) – mik

+0

ありがとうございます、私はちょうどそれを見ました... – loki

-1

Rudy VelthuisのBigDecimalsユニットのように見えます。精度と精度の小数点以下の桁数百万

+1

適切に発音しません。なぜそう思うのですか?パフォーマンスの影響を考慮しましたか?しかしもっと重要なことは、質問に答えることです。 –