我什么时候使用fabs什么时候使用std :: abs就足够了?

时间:2010-06-25 13:02:15

标签: c++ math.h cmath

我认为使用absfabsmath.h的行为会有所不同。但是当我只使用cmathstd::abs时,我是否必须使用std::fabsfabs?或者这不是定义的吗?

4 个答案:

答案 0 :(得分:118)

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

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

答案 1 :(得分:22)

fabsdouble参数使用float仍然可以。我更喜欢这个,因为它确保如果我不小心将std::abs剥离,那么浮点输入的行为保持不变。

我只花了10分钟调试这个问题,因为我自己错误地使用了abs而不是std::abs。我假设using namespace std;会推断std::abs,但它没有,而是使用C版本。

无论如何,我认为将fabs代替abs用于浮点输入是一种很好的方式来记录你的意图。

答案 2 :(得分:9)

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

如果您忘记包含< cmath>,则std::abs(my_float_num)可以是std::abs(int)而不是std::abs(float)。很难注意到。

答案 3 :(得分:1)

“abs”和“fabs”仅对于C ++浮点类型是相同的,当它们可以被翻译时没有模糊的过载消息。

我正在使用g ++(g ++ - 7)。 与模板使用一起使用,特别是在使用mpreal的情况下,存在难以“模糊过载”消息的情况 - abs(static_cast<T>(x))并不总能解决这个问题。 当abs不明确时,工厂有可能按预期工作。对于sqrt,我发现没有这么简单的逃脱。

几个星期以来,我很难在C ++上挣扎“不存在问题”。我正在将旧的C ++程序更新为C ++ 14,以获得比以前更多更好的模板使用。通常,相同的模板参数可以是任何标准浮点数或复数类型或类类型。为什么,长双重行为比其他类型更明智。 一切正常,我之前已经加入了mpreal。 然后我将我的默认浮点类型设置为mpreal并且遇到了大量的语法错误。 这给了成千上万的模糊过载,例如:对于abs和sqrt,为不同的解决方案而哭泣。有些需要重载的帮助功能,但在模板之外。不得不使用Zero或One或type_cast单独替换0.0L和1.0L的精确常量类型 - 由于模糊不清,无法自动转换定义。

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