2016-09-20 7 views
1

最近、プログラムのバグを解決しようとしていたが、問題は以下のコードにあることに気づいた(タイプはバイトではなかったが、この質問に対してはオーバーサイズ):の.NETで長いlong結果を持つPowerを実行するにはどうすればよいですか?

long GetValue(byte x, byte y, byte z) { 
    return (long)Math.Pow(x, y) * z; 
} 

与えられた例値:X = 27、Y = 12、Z = 7

そして:

a = 27^12 = 150,094,635,296,999,121 
r = a * 7 = 1,050,662,447,078,993,847 

しかし、C#.NETコードを与える:

a = 27^12 = 150,094,635,296,999,136 
r = a * 7 = 1,050,662,447,078,993,952 

手がかりとしてリターンを表すMath.Pow関数である:

1.5009463529699914E+17 

Math.Pow機能のみ倍の必要性が存在するためである、とダブルスは超えて不正確さのレベルを有します特定の分数値。結果はlong.MaxValueに近づいているので、その不正確な浮動小数点数はキャストの結果としてlong値に影響を与えています。

longに対応するMath.Pow関数はありません。フードの下では、ロングとダブルは64ビットの数値なので、何か言い表せば言い訳が出てきます。しかし、(私の心に)ロングは、浮動小数点演算を使用すべきではありません。

これは、CPUが32ビット以上の小数ではない正確な計算を実行できないことを意味しますか? Windowsの電卓がこの数学の権利を得ることができるので、それは私には非常にありそうもないようです。

.NET内でこのような問題がどのように解決されるはずですか?私はある種の機能を見逃していると仮定しています。

(元の問題は、私はもはや、このコードが必要にソリューション設計のアプローチを変えないことで解決しましたが、私はそれが面白かったとして、私はとにかく、質問を投稿しようと思いました。)

よろしく、 ロブ。

答えて

0

BigIntegerクラスを使用すると、任意の精度整数を扱うことができます。これは問題の標準的な解決策です。

long.MaxValueより大きい数値を必要としない場合は、自分自身も素朴な力関数を書くことができます。

CPUは固定サイズの整数で動作します。任意のサイズの整数はソフトウェアソリューションです。

+0

ああ、ありがとう、元のコードを書き直して今すぐ動作させることができました。元のソリューションは2005年に書かれたもので、当時はBigIntegerが存在しなかったようです。進捗 :) – peridian

関連する問題