C++学习------cmath头文件的源码学习04
原创
©著作权归作者所有:来自51CTO博客作者桑榆晚见天的原创作品,请联系作者获取转载授权,否则将追究法律责任
宏函数定义---比较函数
比较两数的关系,给出bool判断结果
305 #define isgreater(x, y) __builtin_isgreater((x), (y))
306 #define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
307 #define isless(x, y) __builtin_isless((x), (y))
308 #define islessequal(x, y) __builtin_islessequal((x), (y))
309 #define islessgreater(x, y) __builtin_islessgreater((x), (y))
310 #define isunordered(x, y) __builtin_isunordered((x), (y))
isgreater---返回x是否大于y
isgreaterequal---返回x是否大于等于y
isless---返回x是否小于y
islessequal---返回x是否小于等于y
islessgreater---返回x是否小于或者大于y
isunordered---返回x和y是否不可排序(即判断x,y中是否有Nan)
上面是这几个函数的解释,我们来看看glibc中非内建函数的解释: 其中isunordered的判断是将两数相比较,如果其中有一个Nan那么两者一定不相等,同时判断两数自身和自身是否相等,Nan数是没法做这个判断的,所以返回true,这样就说明只要有一个数为Nan,那么isunordered就会返回true;
其它函数的判断中,也是结合了isunordered的结果的,只有可排序的数才能比较大小,所以如果有Nan数,那么之前的所有比较函数都会返回false,这一点要注意。
//glibc/math/math.h
1312 # define isgreater(x, y) \
1313 (__extension__ ({ __typeof__ (x) __x = (x); __typeof__ (y) __y = (y); \
1314 !isunordered (__x, __y) && __x > __y; }))
1315 # define isgreaterequal(x, y) \
1316 (__extension__ ({ __typeof__ (x) __x = (x); __typeof__ (y) __y = (y); \
1317 !isunordered (__x, __y) && __x >= __y; }))
1318 # define isless(x, y) \
1319 (__extension__ ({ __typeof__ (x) __x = (x); __typeof__ (y) __y = (y); \
1320 !isunordered (__x, __y) && __x < __y; }))
1321 # define islessequal(x, y) \
1322 (__extension__ ({ __typeof__ (x) __x = (x); __typeof__ (y) __y = (y); \
1323 !isunordered (__x, __y) && __x <= __y; }))
1324 # define islessgreater(x, y) \
1325 (__extension__ ({ __typeof__ (x) __x = (x); __typeof__ (y) __y = (y); \
1326 !isunordered (__x, __y) && __x != __y; }))
1327 /* isunordered must always check both operands first for signaling NaNs. */
1328 # define isunordered(x, y) \
1329 (__extension__ ({ __typeof__ (x) __u = (x); __typeof__ (y) __v = (y); \
1330 __u != __v && (__u != __u || __v != __v); }))
函数族定义---绝对值函数fabs与abs
后续的函数都有三个类似的,对应double类型,float类型,long double类型,我们分析其中的double类型就好。
189 double fabs(double __x) __attribute_const__;
190 float fabsf(float __x) __attribute_const__;
191 long double fabsl(long double __x) __RENAME_LDBL(fabs, 3, 3) __attribute_const__;
后面C++11又增加了一个函数,通过函数重载,可以接受int型输入
double fabs (double x);
float fabs (float x);
long double fabs (long double x);
double fabs (T x); // additional overloads for integral types
函数族定义---fma乘加法,返回x*y+z的值
double fma (double x , double y , double z);
float fma (float x , float y , float z);
long double fma (long double x, long double y, long double z);
double fma (Type1 x , Type2 y , Type3 z); // additional overloads
函数族定义---fmax,返回两数中较大的那一个
double fmax (double x , double y);
float fmax (float x , float y);
long double fmax (long double x, long double y);
double fmax (Type1 x , Type2 y); // additional overloads
函数族定义---fmin,返回两数中较小的那一个
double fmin (double x , double y);
float fmin (float x , float y);
long double fmin (long double x, long double y);
double fmin (Type1 x , Type2 y); // additional overloads
函数族定义---fdim,如果x>y,返回x-y的值,其它情况都返回0
double fdim (double x , double y);
float fdim (float x , float y);
long double fdim (long double x, long double y);
double fdim (Type1 x , Type2 y); // additional overloads
其它函数见后续分析