为啥 std::abs() 不能与浮点数一起使用

Posted

技术标签:

【中文标题】为啥 std::abs() 不能与浮点数一起使用【英文标题】:Why doesn't std::abs() works with floats为什么 std::abs() 不能与浮点数一起使用 【发布时间】:2020-08-14 09:12:00 【问题描述】:

std::abs(0.5f) 的结果是0,因为浮点数没有过载。为什么?我正在使用 G++。

【问题讨论】:

minimal reproducible example 会很有用。我无法重现您遇到的不当行为。 @Eljay 是我的错,我说的是abs(),却写了std::abs(),因为我认为它们是一样的东西。 啊,是的,我以前犯过这个错误。这是我创建 deader 文件 的原因之一,这些文件是伪造的 C++ 头文件,仅定义标准所需的符号,不包含任何其他头文件,并且不包含任何其他头文件。 (它们会编译,但不会链接,除了编译和健全性检查以及帮助“包含您使用的内容”之外,它们实际上是非功能性的。) 【参考方案1】:

在使用 std::abs 的重载时必须非常小心,因为一些标准库实现会在许多文件中散布重载,其中一些文件会隐式包含到其他文件中,例如 <iostream>

如果您 #include <cmath>#include <cstdlib>(C++17 中的第二个)之前您的 std::abs(0.5f)float 重载将可用。如果不是这种情况,那么您的编译器/标准库实现中存在错误(不太可能在 g++ 的情况下)。

参考:https://en.cppreference.com/w/cpp/numeric/math/fabs

【讨论】:

还有两个不同的函数 - absstd::abs?他们有不同的重载? @Gordem:见***.com/questions/21392627/…。这绝对是一团糟。我什至在我的商店里有一个规则:#include <cmath>,并且只使用std::<something or other> 我。例如,这个烂摊子不仅涉及abs()? @Gordem 还有其他不相关的messes,恐怕。

以上是关于为啥 std::abs() 不能与浮点数一起使用的主要内容,如果未能解决你的问题,请参考以下文章

SSE 整数与浮点数练习

整数与浮点数

定点数与浮点数

与浮点数和双精度相关的概念

处理大数字与浮点数

计算机中的定点数与浮点数 浮点数用 正负位 幕数 数字部分来表示