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);
所以,你的问题,弄清楚了么?