102

我假设abs并且fabs在使用math.h. 但是当我只使用cmathand时std::abs,我必须使用std::fabsorfabs吗?还是没有定义?

4

4 回答 4

126

在 C++ 中,使用std::abs;总是足够的。它对所有数字类型都重载了。

在 C 中,abs仅适用于整数,并且您需要fabs浮点值。这些在 C++ 中可用(以及所有 C 库),但没有必要使用它们。

于 2010-06-25T13:06:30.683 回答
23

使用fabsfordoublefloatarguments 仍然可以。我更喜欢这个,因为它确保如果我不小心去掉了std::abs浮点输入的行为保持不变。

由于我自己错误地使用abs而不是std::abs. 我假设using namespace std;会推断std::abs,但事实并非如此,而是使用 C 版本。

无论如何,我相信使用浮点输入fabs代替abs浮点输入是一种清楚地记录您的意图的方式是很好的。

于 2012-12-09T22:44:46.957 回答
13

std::fabs明确推荐浮点输入还有一个理由。

如果您忘记包含 <cmath>,您std::abs(my_float_num)可以std::abs(int)使用std::abs(float). 很难注意到。

于 2016-07-14T07:19:25.853 回答
1

"abs" 和 "fabs" 仅对于 C++ 浮点类型是相同的,当它们可以在没有模棱两可的重载消息的情况下进行翻译时。

我正在使用 g++ (g++-7)。连同模板的使用,特别是在使用 mpreal 时,有些情况下会出现硬“模棱两可的过载”消息 -abs(static_cast<T>(x))并不总是能解决这个问题。当 abs 不明确时,fabs 有可能按预期工作。对于 sqrt,我发现没有这么简单的转义。

几周以来,我一直在努力解决 C++“不存在的问题”。我正在将一个旧的 C++ 程序更新为 C++14,以便比以前更多更好地使用模板。通常,相同的模板参数可能是实际的任何标准浮点或复杂类型或类类型。为什么,长双重行为比其他类型更明智。一切正常,我之前已经包含了 mpreal 。然后我将我的默认浮点类型设置为 mpreal 并得到了大量的语法错误。这给了数以千计的模棱两可的重载,例如 abs 和 sqrt,需要不同的解决方案。有些需要重载的帮助功能,但在模板之外。必须使用零或一或 type_cast 将 0.0L 和 1.0L 的一千个用法单独替换为精确的常量类型 - 由于模棱两可,自动转换定义是不可能的。

截至 5 月,我发现隐式转换的存在非常好。但更简单的是,没有任何类型,并且将具有安全显式 type_casts 的类型保存常量转换为任何其他标准常量类型。

于 2017-07-14T17:09:22.143 回答