有一个related question但我相信它没有回答这个问题。
查看 std::abs
and std::fabs
documentation他们似乎有完全相同的行为。作为个人笔记,在我看来 std::fabs
更可取,因为它减轻了 std::abs(int)
的歧义<cstdlib>
中的定义(参见 note)。
所以我的问题是:除了 std::abs(int)
潜在的歧义,std::abs
之间有什么区别吗?和 std::fabs
什么时候应用于浮点值?
最佳答案
在包含 cmath
的符合标准的代码中并且只调用 std::abs
在 float
小号,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
如果我包括了 cmath
或 int
如果我包括了 cstdlib
但不是 cmath
.类似于 short int
.签名似乎并不重要。
在我的平台上,complex
header 显然会导致 std::abs
的整数和浮点重载。被宣布。我不确定这是强制性的;也许你可以找到一个其他方面合理的平台,std::abs(1e222)
返回包含错误标准 header 集的无穷大。
“您在程序中忘记了 header ”的通常结果是编译失败并提示 undefined symbol ,而不是行为上的无声更改。与 std::abs
, 但是,结果可以是 std::abs(42)
返回 double
如果你忘记了 cstdlib
或 std::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/