为啥 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
【讨论】:
还有两个不同的函数 -abs
和 std::abs
?他们有不同的重载?
@Gordem:见***.com/questions/21392627/…。这绝对是一团糟。我什至在我的商店里有一个规则:#include <cmath>
,并且只使用std::<something or other>
。
我。例如,这个烂摊子不仅涉及abs()
?
@Gordem 还有其他不相关的messes,恐怕。以上是关于为啥 std::abs() 不能与浮点数一起使用的主要内容,如果未能解决你的问题,请参考以下文章