今天下了个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(#换成@)
分享到:

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.

   
© 2012 velep.com | reille blog | 管理| 粤ICP备15065318号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量