什么时候使用晶圆厂,什么时候使用std :: abs就足够了?

我认为absfabs在使用math.h时行为是不同的。 但是当我只使用cmathstd::abs ,是否必须使用std::fabsfabs ? 或者是不是这个定义?

在C ++中,使用std::abs总是足够的; 它对于所有的数字types都是超载的。

在C中, abs只能在整数上工作,而你需要fabs的浮点值。 这些都可以在C ++(以及所有的C库)中使用,但是不需要使用它们。

对于doublefloat参数使用fabs还是可以的。 我更喜欢这个,因为它可以确保如果我不小心将std:: off从abs删除,对于浮点input,行为仍然是一样的。

我只花了10分钟debugging这个问题,由于我自己的错误使用abs代替std::abs 。 我假设using namespace std; 会推断std::abs但它没有,而是使用C版本。

无论如何,我认为使用fabs代替abs作浮点input是一种很好的logging你的意图的方法。

还有一个理由更明确地推荐std::fabs用于浮点input。

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

“abs”和“fabs”对于C ++浮点types来说只是相同的,因为它们可以在没有模糊过载的情况下进行转换。

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

自从几个星期以来我很难在C ++“不存在的问题”上挣扎。 我正在将一个旧的C ++程序更新到C ++ 14,以获得比以前更多更好的模板使用。 通常,相同的模板参数可以是实际的任何标准的浮点数或复数types或类types。 为什么呢,长一半的行为比其他types的行为更为合理。 所有人都在工作,我之前已经包括了mpreal。 然后我设置我的默认浮点types为mpreal,并有大量的语法错误。 这给了成千上万的模糊过载,例如abs和sqrt,为不同的解决scheme而哭泣。 有些需要重载的帮助function,但在模板之外。 不得不使用零或一个单独replace0.0L和1.0L的千位用法,或者使用type_cast – 自动转换定义由于含糊不清而不可能实现。

直到5月份,我发现隐式转换的存在非常好。 但更简单的是没有任何其他的,并有安全显式type_casts的types常量与任何其他标准常量types。