什么时候使用fab,什么时候使用std :: abs足够?


100

我认为absfabs使用时的行为有所不同math.h。但是,当我使用just cmath和时std::abs,是否必须使用std::fabsor fabs?还是没有定义?

Answers:


124

在C ++中,使用足够了std::abs;对于所有数值类型,它都已过载。

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


在每个平台上都是这样吗?Esp。Windows和Mac OS X?还是至少在C ++标准中?
数学

3
@brubelsabs:是的。由于C ++具有函数重载(可以为多种类型定义Abs,并且在C ++中),因此在C ++中不需要单独的fabs函数。该标准也保证了这一点。当然,如果您四处寻找一些已经使用了10年以上的过时的编译器,则可能会发现不支持它的编译器。
stinky472 2010年

1
这是一个在C ++标准,所以这是一个体面的编译器,包括Windows和Mac OS X条26.5每个平台上的情况下说,除了intC库的版本,也有过载longfloatdoublelong double。第26.2.7条还为定义了一个重载complex
Mike Seymour 2010年

6
如果您忘记了std::而只是使用abs,则您的代码将在Windows上按预期工作,但将使用intlinux上的版本,这很难调试。
2015年

所有数字类型” [需要引用]。我可以看到int,long,long long,std :: intmax_t,float,double,long double。我看不到任何简短版本或char版本(或无符号版本)。
user673679

23

使用fabsfor doublefloatarguments 仍然可以。我喜欢这个,因为它确保了如果我意外地剥离std::abs,该行为仍然是浮点输入的相同。

由于我自己使用abs而不是的错误,我仅花了10分钟的时间调试了这个非常严重的问题std::abs。我以为using namespace std;可以推断出结果,std::abs但没有,而是使用C版本。

无论如何,我认为最好使用fabs而不是abs浮点输入作为清晰记录您的意图的一种方式。


2
那真是怪了。您的通话应该是模棱两可的(因此是一个错误),对吗?
尼克,

您不应该将fabsf用于浮动吗?所以我不认为它们是相同的。
尼克,

提防Android NDK g ++,它还会让给c abs()函数而不是std :: abs()。但是在Visual Studio c ++编译器中,abs始终指向std :: abs()。
萨瑟顿,2015年

@Nick,我想我同意你的观点:我似乎没有得到Alan Turing的行为,即,对我来说,只要在调用时已说明,重载std::abs似乎总是在调用(而不是C的C版本abs)开始。我不知道这是否是特定于编译器的。absusing namespace std;
MaviPranav '16

@Nick不是错误,因为有一个匹配的函数名称。由实现定义,将选择哪一个。
PatoSandaña,

11

还有另外一个理由建议std::fabs您明确建议使用浮点输入。

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


1

当“ abs”和“ fabs”可以在没有歧义的过载消息的情况下进行转换时,仅对于C ++浮点类型相同。

我正在使用g ++(g ++-7)。连同模板用法一起使用,尤其是在使用mpreal时,有时会出现“模糊不清的过载”消息- abs(static_cast<T>(x))并非总是能解决问题。如果Abs模棱两可,则晶圆厂可能会按预期工作。对于sqrt,我发现没有这么简单的转义。

自几周以来,我一直在努力解决C ++“不存在的问题”。我正在将旧的C ++程序更新为C ++ 14,以实现比以前更好的模板使用。通常,相同的模板参数可以是实际的任何标准float或complex类型或class类型。为什么长双打比其他类型更明智。一切都在工作,而我以前包括mpreal。然后,我将默认的float类型设置为mpreal,并出现了大量语法错误。这给ab和sqrt带来了数千个模棱两可的重载,为不同的解决方案哭泣。有些需要重载的帮助功能,但在模板之外。必须使用零或一个或type_cast分别用精确的常量类型替换一千个0.0L和1.0L用法-由于模棱两可,因此无法进行自动转换定义。

截至5月,我发现隐式转换的存在非常好。但是要简单得多,那就是没有任何东西,并且将具有安全隐式type_casts的类型保存为其他任何标准常量类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.