第 n 个根实现

2022-09-02 12:50:54

我正在研究一种计算数字的第n个根的方法。但是,我在负数的第n个根上遇到了问题。

大多数人说要使用,但这不适用于负数。Math.pow(num, 1 / root)

我试过这个:

public static double root(double num, double root) {
    if (num < 0) {
        return -Math.pow(Math.abs(num), (1 / root));
    }
    return Math.pow(num, 1.0 / root);
}

但是,它不适用于所有数字,因为根可以是小数。例如,返回 ,但这是一个无效的输入。这也将给出错误的答案,即使是根。例如返回 ,但 -2 没有平方根。root(-26, 0.8)-58.71root(-2, 2)-1.41421


答案 1

(num) ^ (1/root)类似于 ,因此您可以像这样操作:exp( (1/root) * log(num) )

public static double root(double num, double root)
{
    return Math.pow(Math.E, Math.log(num)/root);
} 

答案 2

你想做什么?除非您计划完全正确处理复数,否则您不能取负数的第n个根。

例如,虽然 具有 的主分支 ,但 的唯一分支是 和 。(-8)^(1/3)-2(-4)^(1/2)2i-2i

要正确处理此问题,您需要将数字转换为其极性形式,然后在该形式中获取所需的根。

复数也是如此。其根是 、 和 。然后,您可以使用 de Moivre' 公式以 的形式计算根。-88*exp(i*pi)1/32*exp(i*pi/3)2*exp(i*pi)2*exp[i*(-pi)/3]a + bi