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