今天下了个cjson库(下载链接:https://sourceforge.net/projects/cjson/),用于验证其浮点数的处理。在print_number()中,发现有使用DBL_EPSILON、INT_MAX、INT_MIN等宏的使用。因初次见面,所以特别研究了下。
其中,宏DBL_EPSILON的头文件为:<float.h>,宏INT_MAX、INT_MIN的头文件为:<limits.h>
FLT_EPSILON,DBL_EPSILON,LDBL_EPSILON
这几个宏的定义如下:
/* The difference between 1 and the least value greater than 1 that is representable in the given floating point type, b**1-p. */ #undef FLT_EPSILON #undef DBL_EPSILON #undef LDBL_EPSILON #define FLT_EPSILON __FLT_EPSILON__ #define DBL_EPSILON __DBL_EPSILON__ #define LDBL_EPSILON __LDBL_EPSILON__
它们定义了float单精度和double双精度浮点数的最小值(the smallest value),正哪宏定义上面的注释。这几个宏的具体值,取决于处理器、编译器的版本和设置。
这几个宏一般用于两个浮点数的比较。即:
当:val == val + FLT_EPSILON (浮点数val 等于 浮点数+FLT_EPSILON)
先看简单的应用:
double b = sin(M_PI / 6.0); if (fabs(b - 0.5) < DBL_EPSILON) x++;
再看cjson中的应用:
/* Render the number nicely from the given item into a string. */ static char *print_number(cJSON *item,printbuffer *p) { char *str=0; double d=item->valuedouble; if (d==0) { if (p) str=ensure(p,2); else str=(char*)cJSON_malloc(2); /* special case for 0. */ if (str) strcpy(str,"0"); } else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN) { if (p) str=ensure(p,21); else str=(char*)cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */ if (str) sprintf(str,"%d",item->valueint); } else { if (p) str=ensure(p,64); else str=(char*)cJSON_malloc(64); /* This is a nice tradeoff. */ if (str) { // floor() C 标准库 - <math.h> 描述 C 库函数 double floor(double x) 返回小于或等于 x 的最大的整数值 //if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d); /*else */if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); else { switch (item->decimals) { case 0: sprintf(str,"%.0f",d); break; case 1: sprintf(str,"%.1f",d); break; case 2: sprintf(str,"%.2f",d); break; case 3: sprintf(str,"%.3f",d); break; case 4: sprintf(str,"%.4f",d); break; case 5: sprintf(str,"%.5f",d); break; default: sprintf(str,"%f",d); break; } } } } return str; }
INT_MAX、INT_MIN
这几个宏定义如下:
/* Minimum and maximum values a `signed int' can hold. */ #ifndef __INT_MAX__ #define __INT_MAX__ 2147483647 #endif #undef INT_MIN #define INT_MIN (-INT_MAX-1) #undef INT_MAX #define INT_MAX __INT_MAX__
INT_MAX、INT_MIN主要定义了int数据类型的最大值和最小值,具体值也是取决于处理器、编译器的版本和设置。
» 文章出处:
reille博客—http://velep.com
, 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明:
原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)