2017-05-15 19 views
0

私は二重の値が不足している値をマークするあらかじめ定義された定数と比較されるコードで作業しています。この値は、それらが一定の要件を満たさない場合には(ここではinput)の変数に割り当てられているような方法で使用されます。倍精度浮動小数点数型(Double#)の倍精度浮動小数点型をscalaで比較すると保存されますか?

val BAD = -9999.9 
val verified = if(isQualityOk(input)) input else BAD 

その後のアプリケーションで、数字は、再び彼らが優れているかどうかを調べるかされていません。

if(!myNumber.equals(BAD)) { 
    // do something with it 
} 

私は、したがって、されてそれらの差の絶対値を比較することをお勧めします、一般的にエラーが原因(有限機械精度)を丸めの「等しい」を使用してフロート/ Double値を比較することは悪い考えであることを承知しています一定の制限の下で

私の質問:これは数字で算術演算が行われていない上記の例でも必要ですか?この場合、Double#equalsの実装を使用するのは安全ですか?

答えて

1

より安全なデータ型を使用する事を再配置したいです。

しかし、これは関数型プログラミングで特殊なケースを処理する方法ではありません。

これは、次のような何かをするために、おそらくより明確になります:

val verified: Option[Double] = Some(input).filter(isQualityOk) 

型システムを使用して、有効な値を持っているかわからないことを示していますように、品質があれば(それはNoneになりますよくない)。

通常、関数f(d: Double): Tverifiedに適用する場合は、verified.map(f)を入力してOption[T]とし、続けてください。あなたは真の価値を必要とするたび

、あなたは常にverfied.getOrElse(BAD)を行うことにより、バックDoubleに取得することができますが、型システムは、あなたには、いくつかのエラーを回避することができますよう、できるだけ長くNoneとして例外的なケースを維持することをお勧めします。

+0

ありがとうございます!私はこれが機能していないことを十分に認識しています、私はちょうど既存のコードを見直しています。私の例も簡素化されています.2つ以上の "フラグ"つまり良い/悪いだけの定数があります。 –

0

計算がない場合、精度を失う場所はありません(10進数から2進数への変換を除く)。 だからあなたはすごくいいはずです。

これは言いましたが、これは、あなたが言及したレスポンスのために2-3のバージョンが微妙なバグを生成するような種類のコードなので、このコードを実行可能なコード長期的には、私はあなたがあなたのDouble Sには、浮動小数点演算を行わない場合、それは問題ないはずです(verified音が、それはありません、Booleanする必要がありますように?)

関連する問題