8

float... または MinValue についても同じ質問をすることができます。

特別な価値として使おうと思っています。精度が原因でバグが発生することはありますか? これらの数値で算術演算を行うことは期待していません。設定するだけです。

明確化: これをセンチネル値に使用しています。

C# 仕様に記述されているものですか?

4

5 に答える 5

11

それはあなたがそれをどのように使うかに依存します。

double.MaxValue特別なセマンティクスを持つトークンまたは番兵の値として使用している場合は、そうです。これは、比較対象のビットパターンにすぎません。たとえばdouble.MaxValue、「初期化されていない」または「不明な」値を示すために使用できます。これを行う方法は他にもありますが(たとえば、nullableを使用する場合)、ドメイン内で値が自然に発生しないことを前提として、double?使用することも合理的です。double.MaxValue

ただし、任意のdouble値があり、それがと「等しい」かdouble.MaxValueどうかを確認したい場合は、精度が失われた可能性があるため、数値が互いに小さな範囲(イプシロン)内にあるかどうかを確認する必要があります。他のdouble値を計算するとき。ここで注意すべき問題は、値を超えdouble.MaxValueてオーバーフロー状態を作成することです。

于 2011-04-21T22:19:47.300 に答える
3

と比較double.MaxValueするとdouble.MaxValue、はい、同じになります。バイナリ表現は同一であり、問​​題はありません。一方、次のようなことを試してみた場合:

double myDouble = (double.MaxValue - 3.1415) / 2;
if((myDouble * 2) + 3.1415 == double.MaxValue)
{
    ...
}

そうすれば、おそらく奇妙な精度の問題が発生し始めるでしょう。

以下は、それ自体と比較できない特別な定数です。それ以外は公正なゲームです。

  • NaN
  • NegativeInfinity
  • PositiveInfinity
于 2011-04-21T22:18:26.760 に答える
1

「特別な値」を使用することは、一般的に悪い習慣です。ある種のステータスコードを持つオブジェクトを使用し、次にステータスが例外的でない場合にのみ入力される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
}

必要に応じて、簡単な変換と算術演算を行うために、いくつかの凝った演算子のオーバーロードを行うこともできます。

精度の問題に関しては、この数値を計算する予定がないように思われるため、等価性チェックが機能しないような精度の問題に遭遇することはありません。

于 2011-04-21T22:18:04.560 に答える
1

「特別な」値が必要な場合は、代わりにNullableを使用することをお勧めします。

double? val = ...;

if(val.HasValue)
    // do something with val.Value
于 2011-04-21T22:19:58.873 に答える
0

問題ないと思います。技術的な説明はありませんが、比較にMaxValueまたはMinValueを何度も使用しており、問題になることはありません。

于 2011-04-21T22:18:40.730 に答える