c++ - abs() 对一些非常大的 double 值返回负值

标签 c++ absolute

我正在处理一些大的 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 中,更改 absstd::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/

相关文章:

html - 使用元素中心定位元素?

html - 为什么将绝对定位元素的兄弟元素设置为位置 :relative, 使其高于前者?

php - 在 mPDF 中定位

c++ - 令人尴尬的并行代码的低性能

c++ - 有没有办法做一个 C++ 风格的编译时断言来确定机器的字节顺序?

c++ - 将枚举作为函数参数传递

c++ - 让其 C++ 开发应用程序在 64 位模式下运行有什么大的优势吗?

html5-video - CSS 过渡 + 绝对定位的 HTML5 视频 + 海报导致闪烁

html - 将绝对定位的网页更改为居中的网页

c++ - 重复循环直到按下回车