Elc*_*hin 8 java android bigdecimal
我有一个简单的BigDecimal,我想为另一个BigDecimal供电,例如11.11 ^ -1.54.在Java/Android中最好的方法是什么?我不喜欢转换为双打的想法,因为它是用于医疗应用,所以我很欣赏最大的可能性.到目前为止,我已经查看了来自Google Guava的http://commons.apache.org/math/和数学内容,但一无所获.
编辑:整个计算很复杂,并且有很多这样的操作.我需要尽可能多的精度.
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 );
Run Code Online (Sandbox Code Playgroud)
您需要多少位精度?您在示例中仅使用 4 位数字。如果这是医学上的并且适用于现实世界,则您只能以 10-13 位的精度测量现实世界中的大多数事物,而 double 的精度高达 16 位。
System.out.println(Math.pow(11.11, -1.54));
Run Code Online (Sandbox Code Playgroud)
印刷
0.024524510581710988
Run Code Online (Sandbox Code Playgroud)
如果您使用本书中的库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.");
Run Code Online (Sandbox Code Playgroud)
打印(我们代表微秒)
0.024524510581710988 took 0.478 us avg.
0.02452451058171098739 took 603.769 us avg.
Run Code Online (Sandbox Code Playgroud)
精度为 40 位
0.0245245105817109873886495555036930857940 took 1409 us avg.
Run Code Online (Sandbox Code Playgroud)
这在您的设备上可能仍然足够快。
我没有包含代码,部分原因是它很长。我对它的速度印象深刻。;)
| 归档时间: |
|
| 查看次数: |
7838 次 |
| 最近记录: |