我有两个值:X = -78.0921
和Y = -64.6294
。现在,当我想要计算Math.Pow(X, Y)
时,它会返回NaN。我该怎么办?我该如何解决这个问题?
我该如何计算这个力量?还有其他功能可以计算出来吗?...或者它可能没有数学定义?
答案 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);
}
}
希望有帮助!