我正在研究计算数字的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没有平方根。
答案 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' formula以a + 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));