私はコードを持っていますが、それを理解していません。精度が非常に重要なアプリケーションを開発しています。しかし、それは.NETにとって重要ではありません、なぜですか?知らない。
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
しかし、メッセージボックスには次のように表示されます。3.5助けてください、ありがとう。
精度が非常に重要な場所で何かをしている場合は、浮動小数点の制限に注意する必要があります。良い参考資料は、DavidGoldbergの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」です。
浮動小数点では十分な精度が得られず、10進型で作業する必要がある場合があります。ただし、これらは常に浮動小数点よりもはるかに低速です。これは、精度と速度の間のトレードオフです。
aの精度Double
は15桁(内部では17桁)です。計算する値Math.Pow
は正しいですが、それに追加するとvalue
、違いを生むには小さすぎます。
編集:
Decimalはその精度を処理できますが、計算は処理できません。その精度が必要な場合は、計算を実行してから、各値をaDecimal
に変換してから、それらを合計する必要があります。
double value = 3.5;
double small = Math.Pow(10, -20);
Decimal result = (Decimal)value + (Decimal)small;
MessageBox.Show(result.ToString());
または、doubleではなくDecimalタイプを使用します。
精度を上げることはできますが、それは他に何をしたいかによって異なります。コンソール アプリケーションに以下を配置すると、次のようになります。
double a = 1e-20;
Console.WriteLine(" a = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);
decimal b = 1e-20M;
Console.WriteLine(" b = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);
あなたは得るでしょう
a = 1E-20
1+a = 1
b = 0,00000000000000000001
1+b = 1,00000000000000000001
ただし、このPow
関数は、Math クラスのほとんどすべての関数と同様に、double のみを使用することに注意してください。
double Pow(double x, double y);
そのため、10 進数のサインを取得することはできません (それ以外の場合は、2 倍に変換することによって)。
この質問も参照してください。
倍精度とは、15〜16桁を保持できることを意味します。3.5 + 1e-20=21桁。二重精度で表すことはできません。10進数などの別のタイプを使用できます。