8

11.11^-1.54 など、別の BigDecimal に電力を供給したい単純な BigDecimal があります。Java/Android でそれを行う最も適切な方法は何でしょうか? 医療用なのでダブルに変換するのは好きではないので、可能な限り最大の精度をいただければ幸いです。これまでのところ、Google Guava のhttp://commons.apache.org/math/と数学の内容を確認しましたが、何も見つかりませんでした。

編集: 計算全体が複雑で、このような多くの操作があります。最後に可能な限りの精度が必要です。

4

4 に答える 4

9

BigDecimal のユーティリティ クラスhttps://github.com/tareknaj/BigFunctions

z = x^y の例 --> z = exp ( ln(x) * y )

final int SCALE = 10;
BigDecimal x = new BigDecimal(1);
BigDecimal y = new BigDecimal(12);

BigDecimal z = BigFunctions.exp( BigFunctions.ln(x, SCALE).multiply(y),SCALE );
于 2014-03-21T10:29:22.283 に答える
4

何桁の精度が必要ですか?例では4桁しか使用していません。これが医療であり、現実の世界では、現実の世界のほとんどのものを10〜13桁の精度でしか測定できず、doubleの精度は最大16桁です。

System.out.println(Math.pow(11.11, -1.54));

プリント

0.024524510581710988

この本http://www.apropos-logic.com/nc/のライブラリを使用すると、次のようになります。

int runs = 10000;

long start = System.nanoTime();
double x1 = 0;
for (int i = 0; i < runs; i++)
    x1 = Math.pow(11.11, -1.54);
long time = System.nanoTime() - start;
System.out.println(x1 + " took " + time / runs / 1e3 + " us avg.");

long start2 = System.nanoTime();
BigDecimal x2 = null;
for (int i = 0; i < runs; i++)
    x2 = exp(ln(BigDecimal.valueOf(11.11), 20).multiply(BigDecimal.valueOf(-1.54)), 20);
long time2 = System.nanoTime() - start2;
System.out.println(x2 + " took " + time2 / runs / 1e3 + " us avg.");

印刷(マイクロ秒単位)

0.024524510581710988 took 0.478 us avg.
0.02452451058171098739 took 603.769 us avg.

40桁の精度で

0.0245245105817109873886495555036930857940 took 1409 us avg.

それでもデバイス上で十分に高速である可能性があります。

コードが非常に長いこともあり、コードは含めていません。私はそれがどれほど速いかに感銘を受けました。;)

于 2012-08-07T15:14:31.923 に答える
2

優れたライブラリ ApFloat があります: http://www.apfloat.org/

于 2013-01-16T17:18:04.903 に答える