我正在使用一些大的双重值,所有数学函数都很好.似乎sqrt,pow和其他数学函数对于大的科学双重值没有任何问题,但是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,std :: abs()中需要fabs(double)或更好时使用abs(int).你说过你尝试过std :: abs(),但如果你有,那就解决了你的问题.
这是C中一个不幸而常见的陷阱.永远不要在前面使用没有std ::的abs().这很危险.