C# 计算负数的幂
我对C#比较陌生,因为Math.Pow(x,y)返回一个负数的NaN(读:不是负幂),我想知道如何更有效地计算结果。我现在写的是一个基本的for循环,但我想知道它是否可以用更短的方式实现(可能使用Linq)C# 计算负数的幂,c#,linq,C#,Linq,我对C#比较陌生,因为Math.Pow(x,y)返回一个负数的NaN(读:不是负幂),我想知道如何更有效地计算结果。我现在写的是一个基本的for循环,但我想知道它是否可以用更短的方式实现(可能使用Linq) for(int i=0;i Math.Pow(x,y)返回负数的NaN 这是因为没有为负基数定义任意幂运算: 当基b是正实数时,可以通过指数函数为所有实数甚至复指数n定义b到n 现在,如果幂是整数,则定义负数的幂运算以获得实数结果,就像您的情况一样,但是Pow不会为您计算它。您应该做的是:
for(int i=0;i
Math.Pow(x,y)
返回负数的NaN
这是因为没有为负基数定义任意幂运算:
当基b是正实数时,可以通过指数函数为所有实数甚至复指数n定义b到n
现在,如果幂是整数,则定义负数的幂运算以获得实数结果,就像您的情况一样,但是Pow
不会为您计算它。您应该做的是:
- 假设您想知道
Pow(-2,5)
- 给出
Pow
问题Pow(2,5)
- 看看指数,如果它是偶数,那么你得到了正确的答案。如果它是奇数,那么让答案为负数
在这种情况下,Pow(2,5)
返回32。指数5是奇数,所以设为-32,就完成了。我想你可以使用System.Numerics.Complex来计算虚数
见:
在Pow(双基,双幂)中,当基<0和幂为分数(ex:power=0.5)时,将生成NaN,因为它可在复域中计算,而不是在实域中。
因此,在使用pow函数之前,您可能需要检查base和power函数。在这种情况下,您应该将所需值作为未定义值(而不是NaN)返回
bellow函数执行此操作,并返回0而不是NaN:
// pow with desired Nan
public double Pow(double x,double y){
double MyNaN = 0; // or any desired value for Nan
double result = MyNaN;
if (Math.Floor (y) != y) { // if y is fractional number
if (x < 0) // if x is negative number
return result;
}
result = Math.Pow (x, y);
return result;
}
//具有所需Nan的pow
公共双电源(双x,双y){
double MyNaN=0;//或Nan的任何所需值
双结果=MyNaN;
if(Math.Floor(y)!=y){//如果y是分数
if(x<0)//如果x是负数
返回结果;
}
结果=数学功率(x,y);
返回结果;
}
你是说它返回NaN
对于类似Math.pow(-2,5)
?使用Math.pow(Math.Abs(x,y)),然后应用正确的符号。Math.pow拒绝负x,因为如果y不是整数,“应用正确的符号”是不可能的。你发布的循环将返回1(假设结果初始化为1)如果你只是想写一个更有效的幂算法,你可以使用分而治之的方法,参见链接(这是一个C
程序,但是翻译成C#
应该很简单)我本来打算给雷蒙德的评论作为答案,但他抢先给了我。一旦更正,应该是Math.Pow(Math.Abs(x),y)。然后如果y是奇数,你用另一种方法求反,结果是正的。y必须是一个整数值。如果幂为负,它将返回1,而不是这种情况。无论如何,代码很好,我想我可以翻译它。我不明白。Pow(-2,5)
确实返回-32
-@Vedanshu一件可能导致这一结果的事情是,如果你的指数不是一个整数,但是非常接近一个整数,以至于你没有注意到它不是。double a=-2,b=4.999999999999999999;Console.WriteLine({0}{1}={2}),a,b,Math.Pow(a,b));
打印“-2^5=NaN。
// pow with desired Nan
public double Pow(double x,double y){
double MyNaN = 0; // or any desired value for Nan
double result = MyNaN;
if (Math.Floor (y) != y) { // if y is fractional number
if (x < 0) // if x is negative number
return result;
}
result = Math.Pow (x, y);
return result;
}