【问题标题】:pow(-0.857487, 1.5) returns NaN - Alternatives?pow(-0.857487, 1.5) 返回 NaN - 替代方案?
【发布时间】:2015-11-18 17:51:41
【问题描述】:

在 C++ 中,当我尝试 pow(-0.857487, 1.5) 它返回 nan。我发现这是由于溢出。

是否有任何替代 math.pow() 或任何其他方法来计算此值?

【问题讨论】:

  • 那是 NaN,很好。这就像除以零。你期待什么结果? :)
  • 那是纯数学,请参阅en.wikipedia.org/wiki/Exponentiation#Rational_exponents 并继续前进.. 呃,我的意思是,检查那些 -0.8 和 1.5 参数,很可能其中一个是错误的(超出您的模型的域)
  • 也许您打算使用std::abs(.) 作为第一个参数?

标签: c++ nan pow


【解决方案1】:

目前的问题不是任何形式的溢出,而是pow(-0.857487, 1.5) = -0.857487 ^ 3/2 = sqrt(-0.857487)^3 = -0.794038... i(简化的演示数学)的结果不是实数。

一般来说,pow(a,b) 不存在于负数a 和非整数b 的实数中。但是,对于正数 apow(a,b) 始终存在并且是真实的,因此如果您只使用实数,您可能需要类似 pow(abs(a),b) 的东西。

如果你真的想要复杂的算术,你可以使用std::complex

#include <iostream>
#include <complex>

int main () {
    std::complex<double> d = -0.857487;
    std::cout << std::pow(d, 1.5);
}

输出:(-1.45862e-16,-0.794038)。见live

【讨论】:

  • 哦,好的,谢谢...我不知道!我正在处理实数。
  • 虽然这是一个很好的答案,但我强烈反对等同于sqrt(-x) = i * sqrt(x)I'm not alone in this.
  • @Rhymoid 是的,我为程序员简化了。我添加了一个评论,但重点是。
【解决方案2】:

问题是你想将负数提升到1.5th 次方,即3/2,而当提升到3时,负号会保留rd 幂,然后你有一个不是实数的负数的平方根。 “解决方法”是您可以将1.5 写成3/2 而不是6/4。这样,指数6 是偶数(与3 不同),它将使您的数字为正数,然后根为实数。但是,这相当于在您尝试将其提高到 1.5 之前使您的数字为正数。

它可能有用,也可能没用。正如我所说,这是一个肮脏的把戏,并且甚至没有定义这个操作(负数的非整数幂)的原因之一。

【讨论】:

  • 获得pow(abs(a),b) 是一个相当迂回的道路。如果您想要pow(abs(a),b),请以更明显的方式对其进行编码。如果您想要pow(a,b) 而不是pow(abs(a),b),请不要使用技巧来假装错误的答案是正确的。
  • @JSF 同意,如果我必须编写此代码,我肯定会选择pow(abs(a),b)。我并没有过多关注代码,而是没有定义这样的操作的概念,因为3/26/4应该是相同的数字,但是使用前者或后者会导致完全不同的结果。
  • 我认为 3/2 和 6/4 是一样的。 pow(x,3./2)pow(x,6./4) 是相同的,在代数中(但不完全是浮点数)pow(pow(x,1./4),6) 仍然相同(与之前的答案相似)。但是您的意思是 pow(pow(x,6),1./4) 也应该是相同的,这太过分了。
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2014-09-20
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多