为什么Math.Pow(-78.0921, -64.6294)返回NaN ?

本文关键字:6294 返回 NaN Pow Math 0921 为什么 | 更新日期: 2023-09-27 18:13:23

我有两个值:X = -78.0921Y = -64.6294。现在,当我想计算Math.Pow(X, Y)时,它返回NaN。我该怎么办?我该如何解决这个问题?

我应该如何计算这个功率?有没有其他的函数可以计算这个?或者它不是数学上定义的?

为什么Math.Pow(-78.0921, -64.6294)返回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);
}