为什么Math.Pow(-78.0921, -64.6294)返回NaN ?
本文关键字:6294 返回 NaN Pow Math 0921 为什么 | 更新日期: 2023-09-27 18:13:23
我有两个值:X = -78.0921
和Y = -64.6294
。现在,当我想计算Math.Pow(X, Y)
时,它返回NaN。我该怎么办?我该如何解决这个问题?
我应该如何计算这个功率?有没有其他的函数可以计算这个?或者它不是数学上定义的?
你试图计算一个非实数
我说的非实数是指,如果我们尝试你能想到的最大和最小的数字之间的每一个数字,这些数字都不是-78.0921的-64.6294次方的解。
事实上,没有实数是-1的0.5次幂或-1的平方根的解,通常对于a^b,如果a为负且b为非整数,结果不是实数。
由于无法在实数中表达这样一个有用的结果,导致了复数的发明。我们称复数系统中的虚单位sqrt(-1) = i
——所有的复数都有一个实分量和一个虚分量,表示为a + b*i
。
一般来说,负数的分数次幂不会产生实数结果,因为它会有i的某个分量-幂越接近0.5,i越大,越接近0.0,越实数,路径沿着实数和虚数之间的圆圈,例如
-1^x = cos(pi*x)+i*sin(pi*x)
阅读更多关于复数的知识:http://en.wikipedia.org/wiki/Complex_number
如果你想在c#中处理复数,试试http://msdn.microsoft.com/en-us/library/system.numerics.complex.aspx
然而,除非复数在你的问题领域有一些意义(它们在许多电气工程,物理和信号分析问题中是有意义的,例如),否则你的数据可能是错误的,或者你的逻辑是错误的,首先试图做这样的事情。
文档声明这些输入的返回值是NaN
。
x & lt;0但不是NegativeInfinity;y不是整数、NegativeInfinity或PositiveInfinity:返回NaN
返回NaN
的原因是该函数没有为您的输入值定义好。
我想你的意思是它返回NaN
,因为你的输入匹配以下内容:
x & lt;0但不是NegativeInfinity;y不是整数、NegativeInfinity或PositiveInfinity
这是正确的,根据文档
以下是我使用的(原生c#库System.Numerics
):
Complex.Pow(x, y).Real;
结果与
相同:double checkSquareRoot(double x, double y)
{
var result = Math.Pow(x, y);
if (x > 0)
{
return result;
}
else
{
return -1 * Math.Pow(-x, y);
}
}
希望有帮助!
我有一个类似的问题,处理如下所示,你必须根据需要调整最小和最大值,在我的情况下,它们是0和10。
double alpha = FastMath.pow(weight, parameters.getAlpha());
if(alpha == Double.NEGATIVE_INFINITY) {
alpha = 0d;
}
if(alpha == Double.POSITIVE_INFINITY) {
alpha = 10d;
}
double beta = FastMath.pow(1d / distanceMatrix[row][column],
parameters.getBeta());
if(beta == Double.NEGATIVE_INFINITY) {
beta = 0d;
}
if(beta == Double.POSITIVE_INFINITY) {
beta = 10d;
}
这是c#的另一个弱点。我们知道-125的立方根等于-5,但是Console.Write(Math.Pow(-125,1.0/3));
的结果是NaN。也许你应该试试这个:
if (x>0) {
Console.Write(Math.Pow(x,y));
}
else if (x<0) {
double x = Abs(x);
double z = Math.Pow(x,y);
if (y%2==0)
Console.Write(z);
else
Console.Write(-z);
}