web-dev-qa-db-ja.com

Pow(10進数、10進数)のMath APIはありますか

10進数計算用のライブラリ、特にPow(decimal, decimal)メソッドはありますか?何も見つかりません。

存在するかぎり、無料でも商用でもかまいません。

注:私はそれを自分で行うことはできず、forループを使用することも、Math.PowMath.ExpまたはMath.Logを使用することもできません。これらはすべてdoubles、 doublesを使用できません。セリエはdoublesと同じくらい正確なので、使用できません。

37
Maxime ARNSTAMM

乗算器の1つはレートです:1/rate ^(days/365)。

10進数のべき関数がない理由は、その計算にdecimalを使用しても意味がないためです。 doubleを使用します。

10進数のポイントは、exactlyとしてshortとして表すことができる値に対して正確な算術演算を確実に行うことです。 10進数。 rateおよびdaysの適切な値の場合、他の部分式の値は明らかににならない正確に短い10進数値として表されます。不正確な値を扱うことになるので、doubleのようにわずかに不正確な値の高速計算用に設計されたタイプを使用します。

ダブルスで計算したときの結果は、どちらかと言えば数十億ペニーの差があります。誰も気にしない? 後でエラーを丸めます。レート計算は倍精度で行います。通貨に戻す必要のある結果が得られたら、その結果に1万を掛け、最も近い整数に四捨五入し、それを10進数に変換してから、さらに1万で除算すると、小数点以下4桁までの正確な結果が得られます。これは、財務計算には十分なはずです。

48
Eric Lippert

これが私が使ったものです。

output = (decimal)Math.Pow((double)var1, (double)var2);

今は学んでいるだけですが、うまくいきましたが、正しく説明できるかどうかわかりません。

これは、var1とvar2の入力を受け取り、それらをdoubleにキャストして、math.powメソッドの引数として使用することだと私は考えています。その後、math.powの前に(10進数)を入れ、値を10進数に戻し、その値を出力変数に入れます。

私の説明が間違っている場合は誰かが私を修正してくれることを願っていますが、私が知っているのはそれが私にとってうまくいったことだけです。

7
Andrew

さて、これが現在のC#数値ライブラリをリストするWikipediaページです。しかしTBH私は小数の多くのサポートがあるとは思いません

http://en.wikipedia.org/wiki/List_of_numerical_libraries

この種の計算では、一般的に小数を使用するのは不適切です。精度は高いですが、範囲も狭くなっています。 MSDNのドキュメントに記載されているように、これは財務/金銭計算用です-残念ながら、POWへの要求はそれほど多くありません!

もちろん、超高精度を必要とする特定の問題領域があり、すべての数値が10(28)〜10(-28)の範囲内にある場合があります。ただし、その場合は、質問へのコメントにリンクされているような独自の系列計算機を作成する必要があるだけでしょう。

2
James Gaunt

decimalを使用していません。代わりにdoubleを使用してください。このスレッドによると、Math.Pow(double、double)はCLRから直接呼び出されます。

Math.Pow()は.NET Frameworkにどのように実装されていますか?

.NET Framework 4の機能は次のとおりです(2行のみ)

[SecuritySafeCritical]
public static extern double Pow(double x, double y);

64ビット10進数は、この32ビットCLRではまだネイティブではありません。将来的には64ビットフレームワークを使用するのでしょうか?

0
Jeson Martajaya