abs和其他绝对值的区别

Q1: 在C++中,abs和fabs到底有什么区别?

Q2: 为什么我在一些OJ中用abs会显示“Compile Error”或“编译错误”?

在这篇博客中,我们将对这几个问题进行深入的探讨。

工欲善其事,必先利其器。

我们先对abs和fabs以及其他的求绝对值函数的函数进行比较:

/*我把这几个函数的定义合并在一起看*/
int __cdecl abs(int _X);
long __cdecl labs(long _X);
__MINGW_EXTENSION __int64 __cdecl _abs64(__int64);
double __cdecl fabs(double _X);
#ifndef __CRT__NO_INLINE
#if !defined (__ia64__)
__CRT_INLINE double __cdecl fabs (double x)
{
double res = 0.0;
__asm__ __volatile__ ("fabs;" : "=t" (res) : "0" (x));
return res;
}
#endif
#endif

很容易看出,abs适用于整型,labs适用于长整型,_abs64适用于__int64即64位超长整型,fabs适用于任何整型(32位以下,包括小数型【浮点数】)

除了这个区别,还有其他区别吗?

答案是肯定的。

因为如果只有这个区别,你OJ提交上去的代码就不会CE了,最多给你个WA/NA,运气好的还会AC。

最主要的在哪儿呢?

在DEV-C++中输入"abs()",按住Ctrl,鼠标单击abs,会弹出来一个库,往库名那里一看:

stdlib.h

而输入"fabs()",用类似的方法,库的名是

math.h

很多人被误导了,以为abs在math.h库中,但是实际上是在stdlib.h库中间。

这就是CE的原因

在百度百科中,fabs这样被定义:

原型:在TC中原型是extern float fabs(float x);,在VC6.0中原型是double fabs( double x );。

头文件:#include <math.h>

功能:求浮点数x的绝对值

说明:计算|x|, 当x不为负时返回x,否则返回-x

类似函数:abs

在百度百科中,abs这样被定义:

函数名: abs

功 能: 求整型变量的绝对值

头文件:cstdlib cmath

用 法: int abs(int i);

所以,你的问题,弄清楚了么?

原文地址:https://www.cnblogs.com/TonyNeal/p/abs_otherabs.html