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

时间:2013-05-14 13:50:04

标签: c#

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

我该如何计算这个力量?还有其他功能可以计算出来吗?...或者它可能没有数学定义?

6 个答案:

答案 0 :(得分:14)

您试图计算一个不真实的数字。

我不是真的意思是,如果我们尝试了你能想到的最大数字和最小数字之间的每一个数字,那么这些数字都不是-78.0921到-64.6294幂的解决方案。

实际上,没有实数是-1到0.5的幂或-1的平方根的解,并且通常对于a ^ b如果a是负且b是非整数,结果并不真实。

无法用实数表示这样有用的结果会导致复数的发明。我们在复数系统中说sqrt(-1) = i,虚数 - 所有复数有一个真实的组件和一个虚构的组件,表示为a + b*i

一般来说,对于分数幂没有负数会产生实际结果,因为它将包含i的一些分量 - 功率越接近.5,越接近.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

但是,除非复杂数字在您的问题域中具有某些意义(例如,它们在许多电气工程,物理和信号分析问题中都有意义),否则您的数据可能错误或逻辑错误。试图在第一时间做这样的事情。

答案 1 :(得分:13)

documentation表示这些输入的返回值为NaN

  

x< 0但不是NegativeInfinity; y不是整数,NegativeInfinity或PositiveInfinity:返回 NaN

返回NaN的原因是函数没有为输入值定义良好。关于Exponentiation的维基百科文章涵盖了这一主题。

答案 2 :(得分:7)

我认为你的意思是它返回NaN,因为你的输入符合以下内容:

  

x< 0但不是NegativeInfinity; y不是整数,NegativeInfinity或PositiveInfinity

根据the documentation,这是正确的。

答案 3 :(得分:0)

我有一个类似的问题,如下图所示处理,您必须根据需要调整最小值和最大值,在我的情况下,它们是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;
      } 

答案 4 :(得分:0)

这是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);
  Console.Write(-z);
}

答案 5 :(得分:0)

这是我使用的(本机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);
            }
        }

希望有帮助!