質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top