c++ - 应用于浮点值时,std::abs 和 std::fabs 之间有什么区别吗?

标签 c++ floating-point absolute-value

有一个related question但我相信它没有回答这个问题。

查看 std::abs and std::fabs documentation他们似乎有完全相同的行为。作为个人笔记,在我看来 std::fabs更可取,因为它减轻了 std::abs(int) 的歧义<cstdlib> 中的定义(参见 note)。

所以我的问题是:除了 std::abs(int)潜在的歧义,std::abs 之间有什么区别吗?和 std::fabs什么时候应用于浮点值?

最佳答案

在包含 cmath 的符合标准的代码中并且只调用 std::absfloat小号,double s 和 long double s,没有区别。然而,查看 std::abs 返回的类型是有指导意义的。当您使用包含的各种头文件集调用它时,在各种类型上。

在我的系统上,std::abs(-42)double如果我包括了 cmath但不是 cstdlib , 一个 int如果我包括了 cstdlib ,如果我两者都没有包含,它会产生编译错误。相反,std::abs(-42.0)如果我包含 cstdlib 会产生编译错误(不明确的过载)但我没有包括cmath或不同的编译错误(从未听说过 std::abs ),如果我两者都没有包含的话。

在我的平台上,std::abs('x')给我一个 double如果我包括了 cmathint如果我包括了 cstdlib但不是 cmath .类似于 short int .签名似乎并不重要。

在我的平台上,complex header 显然会导致 std::abs 的整数和浮点重载。被宣布。我不确定这是强制性的;也许你可以找到一个其他方面合理的平台,std::abs(1e222)返回包含错误标准 header 集的无穷大。


“您在程序中忘记了 header ”的通常结果是编译失败并提示 undefined symbol ,而不是行为上的无声更改。与 std::abs , 但是,结果可以是 std::abs(42)返回 double如果你忘记了 cstdlibstd::abs('x')返回 int如果你没有。 (或者你可能希望 std::abs 在你传递一个 short 时给你一个整数类型?然后,假设我的编译器得到了正确的提升和重载解析,你最好确保你不包含 cmath 。 )

我过去也花了太多时间试图找出为什么代码像 double precise_sine = std::sin(myfloat)给出不精确的结果。因为我不喜欢在这些惊喜上浪费时间,所以我倾向于避免在 namespace std 中使用标准 C 函数的重载变体。 .也就是说,我使用::fabs当我想要一个 double待退回,::fabsf当我想要一个 float出来,和::fabsl当我想要一个 long double出去。同样对于 ::abs当我想要 int , ::absl当我想要一个 long , 和 ::absll当我想要一个 long long .

关于c++ - 应用于浮点值时,std::abs 和 std::fabs 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34185822/

相关文章:

c++ - Visual Studio 2008 和 Xcode 中的浮点精度

c++ - 从文件对象到文件名

math - float 学有问题吗?

c - 浮点型和整型比较

c++ - FPU 命令 FLDL 将 ST0 中的 double 转换为 long double

java - 从静态类型到动态类型

c++ - 如何从 Qt 启动外部文件?

c - 包含 math.h 后出现 abs 'implicit declaration...' 错误

C simd _m128 晶圆厂

java - 如何查找 2 个值与溢出/覆盖值、模数的差异