4

ここから基数コンバーターを使用して、ulong値で動作するように変更しましたが、大きな数値、特に16677181699666568より大きい数値を変換すると、誤った値が返されていました。私はこれを調べ始め、Math.Pow(3、34)が値16677181699666568を返すことを発見しましたが、実際には3 ^ 34は16677181699666569です。したがって、これは私のためにスパナを投げます。これは、Powメソッド内の倍精度の問題にすぎないと思いますか?私の最も簡単な修正は、ulong値をとる独自のPowを作成することだけですか?

もしそうなら、捕虜をする最も速い方法は何ですか?毎回乗算を行うforループよりも速いものがあると思います。

4

5 に答える 5

7

BigInteger.Powを使用できます。または、私の電力法を使用してlongください。

于 2011-03-23T15:08:21.337 に答える
6

問題は、 がMath.Pow返されることdoubleであり、16677181699666569 に最も近いdouble値は 16677181699666568 です。

Math.Powしたがって、関与せずに:

long accurate = 16677181699666569;
double closestDouble = accurate;
// See http://pobox.com/~skeet/csharp/DoubleConverter.cs
Console.WriteLine(DoubleConverter.ToExactString(closestDouble));

16677181699666568 が出力されます。

言い換えれば、内部で行うことは何でもMath.Pow、取得している結果よりも正確な結果を返すことはできません。

他の人が言ったように、BigInteger.Pow.NET 4 を使用している場合は友達です。

于 2011-03-23T15:09:08.730 に答える
5

すべてのコンピューター科学者が浮動小数点について知っておくべきことを読む

浮動小数点型は概算であり、表示される丸めは正常です。

正確な結果が必要な場合は、 を使用しますBigInteger

于 2011-03-23T15:08:46.347 に答える
1

これは、Pow メソッド内の倍精度の問題にすぎないと思いますか?

はい。

ulong 値を取る独自の Pow を作成するための最も簡単な修正はありますか?

BigInteger.Pow を使用できます。

于 2011-03-23T15:10:32.973 に答える
0

.NET Framework 4 を使用している場合、Microsoft には、大きな数値を操作できる新しい BigInteger クラスが含まれています。

http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx

または、他の誰かが作成した素敵なライブラリを使用することもできます:

http://intx.codeplex.com/ (IntX ライブラリ)

于 2011-03-23T15:09:03.630 に答える