对于大n,java.lang.Math.pow(x,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 ....)所以很明显浮动是不可能的,但双倍可能有足够的精度。     

要回复问题请先登录注册