C ++ POW(X,Y)X负双和Y负双,给出nan作为结果

时间:2015-06-19 20:18:03

标签: c++ pow

我试图在我的C ++ 14代码中执行一个简单的操作pow(-0.89,-0.67),结果是NaN。在SciLab中执行相同操作时,结果为-1.08。在C ++中有什么办法可以得到正确的结果吗?

3 个答案:

答案 0 :(得分:5)

我猜你在SciLab上打错了。你必须写完

-0.89 ^ -0.67

这意味着你做了 - (0.89 ^ -0.67)= - (1.08)。

如果您改为输入

(-0.89) ^ -0.67

你会得到答案-0.5504 - 0.9306i。负数的负根是复杂的,C ++中的pow函数会给你一个NaN结果。

如果您使用std::complex类型,您将得到-0.5504 - 0.9306i的正确答案:

#include <iostream>
#include <complex>
#include <cmath>

int main()
{
    std::complex<double> a(-0.89), b(-0.67);
    std::cout << std::pow(a,b) << std::endl; 
}

输出:

(-0.550379,-0.93064)

答案 1 :(得分:2)

pow()的文档中,您有:

  

如果base为负数且exponent不是整数值,或者base为零且指数为负数,则会发生域错误,将全局变量errno设置为值EDOM。

所以,你得到的结果是预期的。

你可以这样做:

printf ("-0.89 ^ -0.67 = %f\n", -pow (0.89,-0.67) );

给出:

-0.89 ^ -0.67 = -1.081207

我所依据的链接:

  1. c++ pow function- invalid result?
  2. pow() problem
  3. 好问题,+ 1!

答案 2 :(得分:0)

咨询标准总是好的: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 它说:

  

- pow(x,y)返回NaN并引发''invalid''浮点   有限x的例外&lt; 0和有限非整数y。

因此,您的C ++编译器是正确的。它应该返回NaN。