float... または MinValue についても同じ質問をすることができます。
特別な価値として使おうと思っています。精度が原因でバグが発生することはありますか? これらの数値で算術演算を行うことは期待していません。設定するだけです。
明確化: これをセンチネル値に使用しています。
C# 仕様に記述されているものですか?
float... または MinValue についても同じ質問をすることができます。
特別な価値として使おうと思っています。精度が原因でバグが発生することはありますか? これらの数値で算術演算を行うことは期待していません。設定するだけです。
明確化: これをセンチネル値に使用しています。
C# 仕様に記述されているものですか?
それはあなたがそれをどのように使うかに依存します。
double.MaxValue
特別なセマンティクスを持つトークンまたは番兵の値として使用している場合は、そうです。これは、比較対象のビットパターンにすぎません。たとえばdouble.MaxValue
、「初期化されていない」または「不明な」値を示すために使用できます。これを行う方法は他にもありますが(たとえば、nullableを使用する場合)、ドメイン内で値が自然に発生しないことを前提として、double?
使用することも合理的です。double.MaxValue
ただし、任意のdouble
値があり、それがと「等しい」かdouble.MaxValue
どうかを確認したい場合は、精度が失われた可能性があるため、数値が互いに小さな範囲(イプシロン)内にあるかどうかを確認する必要があります。他のdouble
値を計算するとき。ここで注意すべき問題は、値を超えdouble.MaxValue
てオーバーフロー状態を作成することです。
と比較double.MaxValue
するとdouble.MaxValue
、はい、同じになります。バイナリ表現は同一であり、問題はありません。一方、次のようなことを試してみた場合:
double myDouble = (double.MaxValue - 3.1415) / 2;
if((myDouble * 2) + 3.1415 == double.MaxValue)
{
...
}
そうすれば、おそらく奇妙な精度の問題が発生し始めるでしょう。
以下は、それ自体と比較できない特別な定数です。それ以外は公正なゲームです。
「特別な値」を使用することは、一般的に悪い習慣です。ある種のステータスコードを持つオブジェクトを使用し、次にステータスが例外的でない場合にのみ入力されるdouble(/ float / whatever)を使用したいと思います。
public class CalcNumber
{
public CalcNumberStatus Status {get; private set;}
public double Value {get; private set;}
public CalcNumber(double value)
{
Status = CalcNumberStatus.Normal;
Value = value;
}
public CalcNumber(CalcNumberStatus status)
{
if(status == CalcNumberStatus.Normal)
{
throw new Exception("Cannot create a normal CalcNumber without a value");
}
Status = status;
Value = 0;
}
}
public enum CalcNumberStatus
{
Normal,
Error
}
必要に応じて、簡単な変換と算術演算を行うために、いくつかの凝った演算子のオーバーロードを行うこともできます。
精度の問題に関しては、この数値を計算する予定がないように思われるため、等価性チェックが機能しないような精度の問題に遭遇することはありません。
「特別な」値が必要な場合は、代わりにNullableを使用することをお勧めします。
double? val = ...;
if(val.HasValue)
// do something with val.Value
問題ないと思います。技術的な説明はありませんが、比較にMaxValueまたはMinValueを何度も使用しており、問題になることはありません。