2017-02-22 6 views
3

私はクライアントの一人と再利用するためにいくつかのプロジェクトをリファクタリングしています。私はプロパティ設定者の1人を書き直す決定を正当なものにしたいと考えています。このプロパティ設定の条件は有効ですか?

私はコードベースでこの実装を数回見ましたが、もはやここで動作しない開発者によって書かれたので、私は彼にそれについて尋ねることはできません。

次のようにそれが行く:

private double _myProperty; 

public double MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     if (!(Math.Abs(_myProperty - value) < double.Epsilon)) 
     { 
      _myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

私は、プロパティのセッターのために、次の構文を書くと非常によく知って:

if (value != _myProperty) 

しかし、私が行方不明です場合、私は疑問に思ってきた上記の最初の例では何か。私はMath.Abs​​計算が 'value'と '_myProperty'の現在の値の差を与えていることを知っていますが、doubleとの比較はなぜですか?Epsilon? IntelliSenseとMSDNの両方によると、double.Epsilonは "0より大きい最小の正のdouble値を表します"。だから、確かに比較すると、同じように簡単にすることができます

if (Math.Abs(_myProperty - value) > 0) 

以前の開発者は、単に不必要に複雑であること、または私はまだカバーされていないのC#のいくつかの小さなニュアンスをしないのですましたか?

答えて

1

オッズは、以外のいくつかのイプシロン値を使用することでした。あなたが指摘したように、double.Epsilondoubleが表すことができる最小の値であり、異なる2つのダブルはdouble.Epsilonより近づくことはできません。その結果、そのコードは機能的には差がゼロに等しいか2つのダブルスの通常の等価チェックを行うのと同じです。

論理の背後にある一般的な考え方は、「十分に近い」は、あなたが使用している数値の有効数字に基づいた値であると見なされるために、互いに「十分に近い」数字を持つことです対処する。あなたが作業している値の精度を表すSomeBusinessObject.Epsilonを使用するか、単にカーゴカルトコードを書いていて、何をしているのか理解できませんでした。

+0

ありがとう、私はEpsilonのより適切な値を使用するように更新します – Dmihawk

2

Epsilonを使用して2倍の値を比較することは確かに正しいですが、ほとんどの場合、過剰な場合があり、例が示すように誤ってコーディングされる可能性があります。

あなたが指示しているように、2つの倍音の差は決してゼロでなくてもイプシロンより小さくなることはありません。だから、効果的には(つまり、単純な等価性テストよりも意味のある何かをする)差異は< = Epsilonでなければなりません。

if (!(Math.Abs(_myProperty - value) <= double.Epsilon)) 

これにより、2つの値に1ビットのウォブルが可能になります。私はあなたがそれらを保存するよりも多くのCPUサイクルを消費すると思います。確かにユーザー入力を受け入れるために、このテストは完全に過剰です。

私が過去にしたことは、現実世界の意味を持つ自分のイプシロンを定義することです。たとえば、リアルタイムの温度測定を監視している場合、私は1E-6°F以下の変化には興味がないので、それをEpsilonと定義します。

関連する問題