Decimal
データ型にEpsilon
フィールドがないのはなぜですか?
マニュアルによると、値の範囲decimal
は±1.0×10e−28〜±7.9×10e28です。
Double
ゼロより大きい最小の正の値を表します
したがって、そのようDecimal
な(自明ではない)値もあるようです。しかし、なぜ簡単にアクセスできないのでしょうか。
+ 1.0×10e−28は、ゼロより大きい正の10進数の最小値であることを理解しています。
decimal Decimal_Epsilon = new decimal(1, 0, 0, false, 28); //1e-28m;
ちなみに、Decimalデータ型の内部表現に関する情報を提供するいくつかの質問があります。
Epsilon
これが役立つ例です。
いくつかのサンプリングセットからの値の加重和と、取得したサンプルの加重(またはカウント)の合計があるとします。次に、加重平均値を計算します。しかし、重み(またはカウント)の合計がまだゼロである可能性があることを私は知っています。ゼロによる除算を防ぐためif... else...
に、ゼロをチェックすることができます。または私はこのように書くことができます:
T weighted_mean = weighted_sum / (weighted_count + T.Epsilon)
このコードは私の目には短いです。または、代わりに、をスキップして+ T.Epsilon
、代わりに次のように初期化することもできます。
T weighted_count = T.Epsilon;
実際の重みの値がに近づくことは決してないことがわかっているときに、これを行うことができますEpsilon
。
また、一部のデータ型とユースケースでは、ブランチが含まれないため、これはさらに高速になる可能性があります。私が理解しているように、ブランチが短い場合でも、プロセッサは計算のために両方のブランチを取ることができません。そして、ゼロが50%の割合でランダムに発生することを知っているかもしれません:=)Decima
lの場合、速度の側面は重要ではないか、最初のケースでは積極的に役立つ可能性があります。
私のコードは一般的なもの(たとえば、生成されたもの)であり、小数用に個別のコードを記述したくありません。Decimal
したがって、他の実数値型と同様のインターフェイスを備えていることを確認したいと思います。