【问题标题】: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++ 头文件,仅定义标准所需的符号,不包含任何其他头文件,并且不包含任何其他头文件。 (它们会编译,但不会链接,除了编译和健全性检查以及帮助“包含您使用的内容”之外,它们实际上是非功能性的。)

标签: c++ floating-point c++-standard-library absolute-value


【解决方案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:见stackoverflow.com/questions/21392627/…。这绝对是一团糟。我什至在我的商店里有一个规则:#include <cmath>,并且只使用std::<something or other>
  • 我。例如,这个烂摊子不仅涉及abs()?
  • @Gordem 还有其他不相关的messes,恐怕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2018-02-25
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多