我假设abs
并且fabs
在使用math.h
. 但是当我只使用cmath
and时std::abs
,我必须使用std::fabs
orfabs
吗?还是没有定义?
4 回答
在 C++ 中,使用std::abs
;总是足够的。它对所有数字类型都重载了。
在 C 中,abs
仅适用于整数,并且您需要fabs
浮点值。这些在 C++ 中可用(以及所有 C 库),但没有必要使用它们。
使用fabs
fordouble
和float
arguments 仍然可以。我更喜欢这个,因为它确保如果我不小心去掉了std::
,abs
浮点输入的行为保持不变。
由于我自己错误地使用abs
而不是std::abs
. 我假设using namespace std;
会推断std::abs
,但事实并非如此,而是使用 C 版本。
无论如何,我相信使用浮点输入fabs
代替abs
浮点输入是一种清楚地记录您的意图的方式是很好的。
std::fabs
明确推荐浮点输入还有一个理由。
如果您忘记包含 <cmath>,您std::abs(my_float_num)
可以std::abs(int)
使用std::abs(float)
. 很难注意到。
"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 的类型保存常量转换为任何其他标准常量类型。