10

C#に問題があります。正確には、Math.pow()を使用します。15 ^ 14を計算しようとすると、「29192926025390624」になります。しかし、Wolfram Alphaで計算すると、「29192926025390625」になります。ご覧のとおり、これは1つの数字だけです。WolframAlphaは正しいです。なぜC#ではないのですか?C#で正しい値を取得できるようにこれを修正するにはどうすればよいですか?7

ハードコードされた例を試しているだけなので、私のコードはかなり単純です。だから私がやっていることは:Math.Pow(15,14);これはを与える29192926025390624。そして、正解である「29192926025390625」ではありません。

リンク:Wolfram Alpha

4

6 に答える 6

11

Math.Pow定義上不正確な浮動小数点型で動作します。任意精度の整数が必要な場合は、 BigInteger構造などの任意精度の整数型を使用してください。BigIntegerにはPowメソッドもあります。

于 2010-11-28T15:27:04.450 に答える
5

Math.Powはdoubleで動作します。長いこの実装は正しい答えを取得します:

Func<long, int, long> power = null;
power = (i, p) => p == 1 ? i : i*power(i, p - 1);
Console.WriteLine(power(15, 14));
于 2010-11-28T15:31:04.670 に答える
4

Math.Powはdoubleで動作します。倍精度小数点は64ビット浮動小数点であり、C#では約15〜16桁の精度があるため、表示されるのは丸め誤差です。これが浮動小数点数の仕組みです。

より高い精度が必要な場合は、decimalを使用してみてください。128ビットで、ベースとして10を使用します。これにより、有効数字28〜29桁までの数値を正確に表すことができます。10進数用に独自のPowメソッドを簡単に定義できます。

decimal十分でない場合は、.NET4で追加されたBigIntegerを使用してください。

于 2010-11-28T15:27:55.913 に答える
1

C#のMath.powは、IEEE754標準の浮動小数点数であるDoubleを返します。有効数字は15桁のみです。

http://msdn.microsoft.com/en-us/library/system.math.pow.aspx http://math.byu.edu/~schow/work/IEEEFloatingPoint.htm

于 2010-11-28T15:30:37.633 に答える
1

Math.Pow()は、doubleデータ型の問題を正しく機能してい ます。これを参照してください。

        double i = 29192926025390625;
        Console.WriteLine("{0}",i);//the result will be 29192926025390624.0

申し訳ありませんが、ブレークポイントで値を確認してください。あなたのプログラムで;

于 2010-11-28T15:48:56.700 に答える