错误的结果被Java Math.pow错误的结果被Java Math.pow(Wrong resul

2019-05-12 11:41发布

如果您尝试运行下面的代码

public class Main {
   public static void main(String[] args) {
       long a = (long)Math.pow(13, 15);
       System.out.println(a + " " + a%13);
   }
}

您将获得“51185893014090752 8”

13 ^ 15正确的值是51185893014090757,即,比由返回的结果更大Math.pow 5。 什么任何想法可能会导致它?

Answer 1:

您已超过显著位可用的数字(约15至16)的双精度浮点值。 一旦你这样做,你不能指望你的结果的最低显著位(县)实际上是有意义的/精确。

如果您需要在Java中任意精度运算,可以考虑使用BigIntegerBigDecimal



Answer 2:

问题是,当你越来越高double值,连续值之间的差距增大-一个double不能代表其范围内的每一个整数,这是发生了什么事情错在这里。 它返回最接近double价值,确切的结果。



Answer 3:

这不是精确的问题。 该Math.pow方法执行结果的近似值。 为了得到正确的结果使用下面的代码。

long b = 13;
for(int i = 0; i != 14; i ++) {
    b = b * 13;
}
System.out.println(b);

输出是预期的结果51185893014090757L。

更一般地,当指数为整数应避免Math.pow方法的使用。 首先,结果是一个近似值,并且第二它是更昂贵的计算。

Math.pow(在Math类大多数其他方法)的实现是基于网络库netlib中的包“可自由分发的数学库”(见StrictMath的javadoc )。 用C实现可在e_pow.c 。



Answer 4:

双具有有限的精度,其尾数为52个比特,这大致等于15至16位小数。 所以,你想计算数量不能由双任何更多的代表(完全一致)。



Answer 5:

正确的答案是提供一种可以由代表最接近的数double

你检查是否是这种情况或不?



Answer 6:

这是因为由铸造翻一番持有长数字的限制,浮你可以,但会有一些错误,你应该自己处理计算的数字将其储存在一个数组,这不是一个简单的方法

但在Python编程语言,你可以有任意长度的结果,它是如此的强大!

成功的!!!



文章来源: Wrong result by Java Math.pow