当应用于浮点值时,std::abs和std::fabs之间有什么区别吗
Is there any difference between std::abs and std::fabs when applied to floating point values?
有一个相关的问题,但我相信它不能回答这个问题。
从std::abs
和std::fabs
文档来看,它们似乎具有完全相同的行为。作为个人注意事项,在我看来,std::fabs
是优选的,因为它缓解了<cstdlib>
中std::abs(int)
定义的模糊性(参见注意事项)。
所以我的问题是:除了std::abs(int)
潜在的模糊性之外,当应用于浮点值时,std::abs
和std::fabs
之间有什么区别吗?
在包含cmath
并且仅在float
s、double
s和long double
s上调用std::abs
的标准一致性代码中,没有差异。然而,当您在包含各种头文件集的情况下调用std::abs
时,查看CCD_14在各种类型上返回的类型是很有指导意义的。
在我的系统中,如果我包含cmath
而不包含cstdlib
,则std::abs(-42)
是double
;如果我包含了cstdlib
,则int
;如果两者都不包含,则会产生编译错误。相反,如果我包含了cstdlib
但没有包含cmath
,则std::abs(-42.0)
会产生编译错误(不明确的重载);如果两者都没有包含,则会产生不同的编译错误(从未听说过std::abs
)。
在我的平台上,如果我包含了cmath
,std::abs('x')
会给我一个double
;如果我包含cstdlib
但不包含cmath
,则会给我int
。类似于short int
。意义似乎并不重要。
在我的平台上,complex
标头显然会同时声明std::abs
的整数和浮点重载。我不确定这是强制性的;也许您可以找到一个合理的平台,在该平台上std::abs(1e222)
返回无穷大,并包含一组错误的标准标头。
"您忘记了程序中的头"的常见后果是编译失败,抱怨未定义的符号,而不是行为的无声变化。然而,对于std::abs
,如果您忘记了cstdlib
,则结果可能是std::abs(42)
返回double
;如果您没有忘记,则结果是std::abs('x')
返回int
。(或者,当你传递short
时,你可能希望std::abs
给你一个积分类型?然后,假设我的编译器正确地获得了升级和重载解决方案,你最好确保不包括cmath
。)
在过去,我也花了太多时间试图弄清楚为什么像double precise_sine = std::sin(myfloat)
这样的代码会给出不精确的结果。因为我不喜欢把时间浪费在这些意外上,所以我倾向于避免namespace std
中标准C函数的重载变体。也就是说,当我希望返回double
时,我使用::fabs
,当我想要输出float
时使用::fabsf
,当我需要输出long double
时使用::fabsl
。类似地,当我想要int
时::abs
,当我需要long
时::absl
,以及当我想要CCD 57时::absll
。
当应用于浮点值时,std::abs和std::fabs之间有什么区别吗?
不,没有。积分类型也没有区别。
使用std::abs()
是习惯用法,因为它最接近常用的数学命名法。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- std::memmove在同一对象之间是否始终安全
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- std::fabs(a * b) 和 std::fabs(a) * std::fabs(b) 之间的区别
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 简单使用 std::atomic 在两个线程之间共享数据
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- "std::function<double(double)>"到"double (*)(double)"之间的转换
- malloc 和 calloc 与 std::string 之间的区别
- std::random_device和std::mt19937_64之间有什么区别
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 我收到void main()和使用命名空间std;之间的冲突;?我正在使用代码块
- iostream和命名空间std之间的关系是什么?