使用幂方法计算 Java 中的第 n 个根
我试图在java中获取一个三次根,但由于它除以双精度,因此它不会返回确切的答案。例如,对于 125,则得到 4.99999999999。有没有解决方法?我知道有一个三次根函数,但我想解决这个问题,这样我就可以计算更高的根。Math.pow(n, 1.0/3)
我不想四舍五入,因为我想知道一个数字是否具有整数根,方法是执行如下操作:.Math.pow(n, 1.0 / 3) % ((int) Math.pow(n, 1.0 / 3))
我试图在java中获取一个三次根,但由于它除以双精度,因此它不会返回确切的答案。例如,对于 125,则得到 4.99999999999。有没有解决方法?我知道有一个三次根函数,但我想解决这个问题,这样我就可以计算更高的根。Math.pow(n, 1.0/3)
我不想四舍五入,因为我想知道一个数字是否具有整数根,方法是执行如下操作:.Math.pow(n, 1.0 / 3) % ((int) Math.pow(n, 1.0 / 3))
由于 不可能有 任意精度的微积分,因此您有三种选择:double
double
double
BigDecimal 对象
执行微积分,该对象支持任意精度的双精度值。private static boolean isNthRoot(int value, int n, double precision) {
double a = Math.pow(value, 1.0 / n);
return Math.abs(a - Math.round(a)) < precision; // if a and round(a) are "close enough" then we're good
}
这种方法的问题在于如何定义“足够接近”。这是一个主观问题,取决于您的要求。
private static boolean isNthRoot(int value, int n) {
double a = Math.pow(value, 1.0 / n);
return Math.pow(Math.round(a), n) == value;
}
此方法的优点是无需定义精度。但是,我们需要执行另一个操作,因此这将影响性能。pow
没有内置的方法来计算大十进制的双倍幂。这个问题将让您了解如何做到这一点。
Math.round 函数将舍入到可以存储为双精度值的最接近的长整型值。您可以比较 2 个结果,以查看该数字是否具有整数立方根。
double dres = Math.pow(125, 1.0 / 3.0);
double ires = Math.round(dres);
double diff = Math.abs(dres - ires);
if (diff < Math.ulp(10.0)) {
// has cubic root
}
如果这还不够,您可以尝试实现此算法,如果结果似乎不是整数,则尽早停止。