第n个根实现

时间:2011-06-13 01:07:26

标签: java math nth-root

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

大多数人都说使用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);
}

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

8 个答案:

答案 0 :(得分:15)

(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);
} 

答案 1 :(得分:9)

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

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

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

因此-8是复数8*exp(i*pi)。它的1/3根是2*exp(i*pi/3)2*exp(i*pi)2*exp[i*(-pi)/3]。然后,您可以使用de Moivre' formulaa + bi形式计算根。

答案 2 :(得分:2)

使用互联网上可用的众多复杂数字包中的一个,或者将您的数字转换为Argand平面上的矩形位置,将其旋转为根所给出的适当角度,然后将其读出为(真实的,假想的一对。

答案 3 :(得分:1)

我使用以下方法。也许这不是最准确的方法,但对我而言效果很好。

template<typename T_Out, typename... T_Args>
inline T_Out get_stats( T_Out f, T_Args&&... args)
{
  return f(std::forward<T_Args>(args)...);
}

答案 4 :(得分:0)

你可以做到         if(num&lt; 0){             返回Math.abs(Math.pow(num,1 / root))         } 然后只要说明值,就使用'+“i”'。或者使用方程的绝对值,然后在需要时使用正/负和i的因子。这对我有用。

答案 5 :(得分:0)

    public double root(double num, double root) {
        double y=1;
        double x;
        while(Math.pow(x, root) != num) {
            if(Math.pow(x, root) > num) {
                x=x-y;
                y=y/10;
            } else {
                x=x+y;
            }
        }
        return x;
    }   

这对你来说应该没问题,虽然它不紧凑,但它尽量少用数学函数。

答案 6 :(得分:0)

我对确切的代码不太确定,但添加了额外的if语句以澄清奇数和偶数根之间。

的内容
public static double root(double num, double root) {
    if (num < 0) {
        if(root%2==1) {
            return -Math.pow(Math.abs(num), (1 / root));
        }
    }
    return Math.pow(num, 1.0 / root);
}

不完全确定这是否适用于您的其他代码,但我希望它可以提供帮助

答案 7 :(得分:-2)

System.out.println(Math.pow(10,Math.log10(Number)/ root));