【发布时间】:2014-10-04 06:21:34
【问题描述】:
我正在处理一些大的 double 值,所有数学函数都很好。看起来 sqrt、pow 和其他数学函数对大的科学 double 值没有任何问题,但 abs 无法处理这些数字。 例如,这没关系:
double s = sqrt(3.9 * 1e32);
但这不是:
double s = sqrt(abs(3.9 * 1e32));
因为abs返回一个负值; 我不明白为什么当所有这些复杂的函数都工作正常时,这个简单的函数不能处理科学的双重操作。是我遗漏了什么,还是真的是这样,我不能对这些值使用 c++ abs 函数?
MCVE
#include <cstdlib>
#include <cstdio>
int main()
{
double d = 3.9e32;
double f = abs(d);
std::printf("%f\n", f);
}
结果
-
Coliru:
2147483647.000000 - g++ 4.8.3-cygwin:
-2147483648.000000
在此 MCVE 中,将 abs 更改为 std::abs 会由于重载解析失败而导致编译错误(无法在 std::abs<int>、std::abs<long>、std::abs<long long> 之间进行选择)。
【问题讨论】:
-
在ideone.com/6CkMVS工作正常
-
是的,约翰,真正的代码是有效的。我只是在这里写的,没有复制代码。
-
你说得对,R Sahu,它在那里工作得很好。但在我在 Linux 上的 Qt 项目中,它得到了 -nan
-
好吧,我向你保证
abs()永远不会返回负数。也许您正在将其转换为 int 或其他内容。您需要准确打印出表达式的每个部分在每个步骤中包含的内容。始终,始终在 C++ 中显式使用std::abs(),因为abs()很危险:它返回int。 -
如何验证 abs 的输出为负值?