C++ 为什么-0.x^0.x-nan(ind)

C++ 为什么-0.x^0.x-nan(ind),c++,nan,C++,Nan,由于某种原因,我的程序出现了故障,我发现这是因为我有一个可以归结为pow(-0.2,0.2)的计算,当调用它时,它解析为-nan(ind) 如果它是一个非常小或非常大的数,我会理解,但是为什么C++将这个计算分解为-NAND(IN)?有没有办法让它输出正确的值(-0.72477966367)?我想你应该计算负数的第五个根,可以写成x^(1/n)。但是C和C++ POW不支持这个。见文件: 如果基为有限负且指数为有限但不是整数值,则会导致域错误 您可以使其输出正确的值,如下所示: templat

由于某种原因,我的程序出现了故障,我发现这是因为我有一个可以归结为pow(-0.2,0.2)的计算,当调用它时,它解析为-nan(ind)


如果它是一个非常小或非常大的数,我会理解,但是为什么C++将这个计算分解为-NAND(IN)?有没有办法让它输出正确的值(-0.72477966367)?

我想你应该计算负数的第五个根,可以写成x^(1/n)。但是C和C++ <代码> POW不支持这个。见文件:

如果基为有限负且指数为有限但不是整数值,则会导致域错误


您可以使其输出正确的值,如下所示:

template <typename T> int sgn(T val) {
    return (T(0) < val) - (val < T(0));
}

template <class T, class U> auto safe_pow(T val, U p) -> decltype(pow(val, p)) {
    return pow(abs(val), p) * sgn(val);
}

auto x = safe_pow(-0.2, 0.2);
template int sgn(T val){
返回值(T(0)decltype(pow(val,p)){
返回功率(绝对值,绝对值)*sgn(绝对值);
}
自动x=安全功率(-0.2,0.2);

谢谢,很遗憾,在我发布问题一分钟后,我才明白这一点,但我想我无论如何都不应该删除它。有问题的是,这对我的程序非常重要。你知道我有什么办法可以解决这个问题吗?@FrédéricHamidi在Python2
(-0.2)**0.2
上引发了ValueError。在Python 3上返回
(0.5863590650926145+0.4260147974712481j)
@kenny,在我的Python 3.4.3上,
-0.2**0.2
产生
-0.7247796636776955
。(编辑:我现在明白了。括号很重要。)我想处理倒奇数指数的特殊情况被认为不够重要,不足以证明复杂的实现和规范是合理的。您需要自己检测和处理这些情况。@Suma:它的定义也很不明确,因为
0.2
不完全是五分之一(这要归功于二进制浮点的常见困难)。所以任何解释它的东西都会有点神奇。你只需要解
x^(1/5)
,或者指数也可以是其他数字吗?指数也可以是其他数字,这就是使事情复杂化的原因:\n它总是采用
x^(k/odd_数)的形式吗
?这是不允许的,因为在大多数情况下,负值的非整数指数会给出复杂的结果。虽然理论上有些指数会给出真实的结果(包括1/5),但允许它们是没有意义的,因为它们不能用浮点精确表示。如果您想要复杂的结果,可以使用重载的
std::pow
来获取
std::complex
参数。谢谢,但是当我尝试实现这段代码时,我得到了错误C3551和4430:如果使用了尾随返回类型,那么前导返回类型应该是单一类型说明符“auto”(而不是“int”),缺少类型说明符-假定为int。注:C++不支持默认的It,我尝试了一些事情,但没有设法修复它,任何机会你可以告诉我如何使它工作?@米兰固定…只有一个
auto
safe\u pow
之前丢失。添加了现场演示链接。你太棒了。非常感谢你。真不敢相信我没有想到在那里添加自动功能,哈哈。注意,正如OP预期的那样,这个处理1/odd,但它提供了一个答案,即使没有真正的答案,比如安全战俘(-3,0.5555)