私は狂っていますか、それとも数学は壊れていますか?
質問
からベースコンバーターを使用しました ここ Ulong値で動作するように変更しましたが、多数を変換すると、特に1667181699666568を超える数字が誤っています。私はこれを調べ始め、Math.Pow(3、34)が実際に3^34が1667181699666569の値16677181699666568を返すことを発見しました。これは、POWメソッド内の二重精度の問題にすぎないと思いますか?私の最も簡単な修正は、私自身の捕虜を生み出すだけで、価値のある価値観を取るのですか?
もしそうなら、捕虜をする最も迅速な方法は何ですか?毎回乗算されたループのためのより速いものがあると思います。
解決
使用できます biginteger.pow. 。または使用します 私のパワー方法 為に long
.
他のヒント
問題はそれです Math.Pow
返品a double
, 、そして最も近い double
16677181699666569の価値は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を使用している場合は、あなたの友達ですか。
読んだ すべてのコンピューター科学者が浮かんでいることについて知っておくべきこと
フローティングポイントタイプは近似であり、表示される丸めは正常です。
正確な結果を使用したい場合 BigInteger
.
これは、POWメソッド内の二重精度の問題にすぎないと思いますか?
はい。
私の最も簡単な修正は、私自身の捕虜を生み出すだけで、価値のある価値観を取るのですか?
biginteger.powを使用できます。
.NETフレームワーク4を使用している場合、Microsoftには、多数を操作できる新しいBigintegerクラスが含まれています。
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx
または、他の誰かが作成した素敵なライブラリを使用することもできます。
http://intx.codeplex.com/ (INTXライブラリ)