c – abs()为一些非常大的double值返回负值

我正在使用一些大的双重值,所有数学函数都很好.似乎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().这很危险.

上一篇:WPF中平铺的问题


下一篇:css实现毛玻璃效果