質問
C#に問題があります。 Math.Pow()で正確に言う。 15^14を計算しようとすると、「29192926025390624」を取得します。しかし、Wolfram Alphaで計算すると、「29192926025390625」を取得します。あなたが見ることができるように、この唯一の違いは1の数です。しかし、Wolfram Alphaは正しいです。なぜC#ではないのですか? C#7で正しい値を取得できるように、これを修正するにはどうすればよいですか?
ハードコーディングされた例で試しているだけなので、私のコードはかなり簡単です。だから私がしていることは: Math.Pow(15,14);
これは与える 29192926025390624
. 。 「29192926025390625」ではなく、正しい答えです。
リンク: ウォルフラムアルファ
解決
Math.Pow
フローティングポイントタイプで動作します 定義により 不正確。任意の精密整数が必要な場合は、 biginteger 構造。 bigintegerもあります 捕虜 方法。
他のヒント
Math.Pow ダブルで動作します。 Longを使用したこの実装には、正しい答えが得られます。
Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));
Math.Pow ダブルで動作します。 ダブルは64ビットのフローティングポイントで、C#には約15〜16桁の精度があります, 、したがって、あなたが見ているのは丸いエラーです。それが、浮動小数点数の仕組みです。
もっと精度が必要な場合は、使用してみてください 小数. 。 128ビットで、10をベースとして使用します。これにより、最大28〜29桁までの数値を正確に表現できます。小数のための独自のPOWメソッドを簡単に定義できます。
もしも decimal
十分ではありません biginteger, 、.NET 4に追加されました。
Math.Pow()はダブルデータタイプで正しく機能しています これを参照してください。
double i = 29192926025390625;
Console.WriteLine("{0}",i);//the result will be 29192926025390624.0
申し訳ありませんが、ブレークポイントで値を確認してください。あなたのプログラムで;
c# 's math.powは、ダブル、IEEE 754標準の浮動小数点番号を返します。 15桁しかありません:
http://msdn.microsoft.com/en-us/library/system.math.pow.aspxhttp://math.byu.edu/~schow/work/ieeefloatingpoint.htm