什么时候使用晶圆厂,什么时候使用std :: abs就足够了?
我认为abs
和fabs
在使用math.h
时行为是不同的。 但是当我只使用cmath
和std::abs
,是否必须使用std::fabs
或fabs
? 或者是不是这个定义?
在C ++中,使用std::abs
总是足够的; 它对于所有的数字types都是超载的。
在C中, abs
只能在整数上工作,而你需要fabs
的浮点值。 这些都可以在C ++(以及所有的C库)中使用,但是不需要使用它们。
对于double
和float
参数使用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。