繁体   English   中英

对于大n,java.lang.Math.pow(x,n)有多准确/精确?

[英]How accurate/precise is java.lang.Math.pow(x, n) for large n?

我想计算(1.0-p)^n ,其中p是0到1之间的双精度数(通常非常接近0),n是一个正整数,可能在几百或几千(可能更大;我是我还不确定)。 如果可能的话,我只想使用Java内置的java.lang.Math.pow(1.0-p, n) ,但是我有点担心这样做可能会导致准确性/准确性的巨大损失。我感兴趣的值范围。有人对使用Java的实现可能会遇到的哪种错误有一个大概的了解? 我不确定它们的实现到底是什么(对数和/或泰勒近似值),所以我不能冒险猜测。

我最担心的是相对误差(即偏离不超过一个数量级)。 如果答案是Java的实现会产生太多错误,那么您是否有任何好的库建议(但再次,我希望这不是必需的)? 谢谢。

根据API文档:

计算结果必须在准确结果的1 ulp以内。

因此,我认为您不必担心实现问题,而不必担心浮点精度的限制。 如果您最关注精度而不是性能,则可能要考虑使用BigDecimal.pow()

您可以看一下java.land.Math类的源文件,看看您是否可以理解确切的方法。 这是链接http://www.docjar.com/html/api/java/lang/Math.java.html

一些经验结果:

public static void main(String[] args)
{
    double e = 0.000000000001d;
    System.out.println(Math.pow(1-e, 1.0d/e));
    float f =  0.000001f;
    System.out.println(Math.pow(1-f, 1.0f/f));
}

0.36788757938730976
0.3630264891374932

两者都应收敛到1 / e(0.36787944 ....),因此显然浮点数是不可能的,但是double可能对您来说有足够的精度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM