我正在处理一些大的 double 值,所有数学函数都很好。 sqrt、pow等数学函数貌似没有big scientific 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>
之间进行选择)。
最佳答案
问题是当你在 C++ 中需要 fabs(double)
或更好的 std::abs()< 时,你正在使用
。你说你试过 abs(int)
/std::abs()
,但如果你试过它就会解决你的问题。
这是 C++ 中一个不幸的常见陷阱。切勿使用前面没有 std::
的 abs()
。这很危险。
关于c++ - abs() 对一些非常大的 double 值返回负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190280/