我认为使用abs
时fabs
和math.h
的行为会有所不同。但是当我只使用cmath
和std::abs
时,我是否必须使用std::fabs
或fabs
?或者这不是定义的吗?
答案 0 :(得分:118)
在C ++中,使用std::abs
总是足够的;所有数值类型都超载了。
在C中,abs
仅适用于整数,并且您需要fabs
来表示浮点值。这些在C ++中可用(以及所有C库),但不需要使用它们。
答案 1 :(得分:22)
对fabs
和double
参数使用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常量赋予任何其他标准常量类型。