4

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

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

4

6 回答 6

14

文档指出这些输入的返回值为NaN.

x < 0 但不是负无穷大;y 不是整数、NegativeInfinity 或 PositiveInfinity:返回NaN

返回的原因NaN是该函数没有为您的输入值明确定义。关于指数的维基百科文章涵盖了这个主题。

于 2013-05-14T13:52:18.420 回答
14

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

我的意思是,如果我们尝试了你能想到的最大数字和最小数字之间的每一个数字,那么这些数字都不是 -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

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

于 2013-05-14T14:02:30.593 回答
7

我认为您的意思是它返回NaN,因为您的输入与以下内容匹配:

x < 0 但不是负无穷大;y 不是整数、NegativeInfinity 或 PositiveInfinity

根据文档,这是正确的。

于 2013-05-14T13:54:14.503 回答
1

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

希望能帮助到你!

于 2019-01-21T14:05:02.420 回答
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;
      } 
于 2015-04-28T12:47:03.433 回答
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);
  if (y%2==0)
       Console.Write(z);
  else
       Console.Write(-z);
}
于 2016-03-15T20:57:35.303 回答