gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:52:24 26 4
gpt4 key购买 nike

我正在处理一些大的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com