Answers:
在C ++中,使用足够了std::abs
;对于所有数值类型,它都已过载。
在C语言中,abs
仅适用于整数,并且需要fabs
浮点值。这些都可以在C ++中使用(以及所有C库),但是不需要使用它们。
int
C库的版本,也有过载long
,float
,double
和long double
。第26.2.7条还为定义了一个重载complex
。
std::
而只是使用abs
,则您的代码将在Windows上按预期工作,但将使用int
linux上的版本,这很难调试。
使用fabs
for double
和float
arguments 仍然可以。我喜欢这个,因为它确保了如果我意外地剥离std::
掉abs
,该行为仍然是浮点输入的相同。
由于我自己使用abs
而不是的错误,我仅花了10分钟的时间调试了这个非常严重的问题std::abs
。我以为using namespace std;
可以推断出结果,std::abs
但没有,而是使用C版本。
无论如何,我认为最好使用fabs
而不是abs
浮点输入作为清晰记录您的意图的一种方式。
std::abs
似乎总是在调用(而不是C的C版本abs
)开始。我不知道这是否是特定于编译器的。abs
using namespace std;
当“ 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的类型保存为其他任何标准常量类型。