[英]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的实现会产生太多错误,那么您是否有任何好的库建议(但再次,我希望这不是必需的)? 谢谢。
计算结果必须在准确结果的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.