float類型最大值和最小值

1.瞭解float存儲結構

float存儲結構請看另外一篇文章http://blog.csdn.net/whzhaochao/article/details/12885875

2.float最大值

float結構以下圖:

要想得到正最大值,那就令符號位爲0,指數位和尾數位全爲1,則應該是最大會是,最大值應該爲:
1.11111111111111111111111*2^128=(2-2^-23)*2^128= 6.805646932770577*10^38
則float類型十六進制表示爲:0x7fff ffff 
 如下是測試代碼:
void main(int argc, char* argv[])
{
	float a=-8.25;
	char *p=(char*)&a;

	*p=0xff;
	*(p+1)=0xff;
	*(p+2)=0xff;
	*(p+3)=0x7f;

	
	printf("\n&a=%x",&a);
	printf("\na=%f",a);

}
結果並不和咱們想的同樣,出現了1.#QNAN0,這個我也不知道爲何,知道緣由的能夠回覆!



若是指數位最後一位爲0,則是咱們想要的結果,
咱們知道float最大爲(2-2^-23)*2^127= 3.4028234663852886*10^38
見float.h
#define FLT_DIG         6                       /* # of decimal digits of precision */
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD       0
#define FLT_MANT_DIG    24                      /* # of bits in mantissa */
#define FLT_MAX         3.402823466e+38F        /* max value */
#define FLT_MAX_10_EXP  38                      /* max decimal exponent */
#define FLT_MAX_EXP     128                     /* max binary exponent */
#define FLT_MIN         1.175494351e-38F        /* min positive value */
#define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */
#define FLT_MIN_EXP     (-125)                  /* min binary exponent */
#define FLT_NORMALIZE   0
#define FLT_RADIX       2                       /* exponent radix */
#define FLT_ROUNDS      1                       /* addition rounding: near */


當咱們令指數位爲:1111 1110 =254 則指數爲254-127=127
尾數位全爲1,則最大數爲1.11111111111111111111111*2^127=(2-2^-23)*2^127=3.4028234663852886*10^38
則十六進制表示爲:0x7f7f ffff

3.測試代碼:

void main(int argc, char* argv[])
{
	float a=-8.25;
	char *p=(char*)&a;

	*p=0xff;
	*(p+1)=0xff;
	*(p+2)=0x7f;
	*(p+3)=0x7f;

	
	printf("\n&a=%x",&a);
	printf("\na=%f",a);

}

咱們從結果能夠看出
&a=12ff44
a=340282346638528860000000000000000000000.000000
這是float的最大值


4.float正最小值

float.h中咱們看到float正的最小值爲  1.175494351e-38F
#define FLT_MIN         1.175494351e-38F        /* min positive value */
經過了解float類型的結構咱們知道如何才能得到正的最小值,要得到正的最小值,咱們只要將指數位置成最小及0000 0000 則指數爲0-127=-127,而後將尾數位最後一位置1,其它置0
及十六進制爲0x0000 00001

5.測試代碼

void main(int argc, char* argv[])
{
	float a=-8.25;
	char *p=(char*)&a;

	*p=0x01;
	*(p+1)=0x00;
	*(p+2)=0x00;
	*(p+3)=0x00;


	printf("\n&a=%x",&a);
	printf("\na=%e",a);


}

咱們獲得的結果爲 1.00000000 00000000 0000 01*2^-127= 5.877472454760670*10^-039,但是結果不是咱們預測的!不知道爲何


若是將指數位置成1,測試代碼以下:
void main(int argc, char* argv[])
{
	float a=-8.25;
	float b=0;
	char *p=(char*)&a;

	*p=0x01;
	*(p+1)=0x00;
	*(p+2)=0x80;
	*(p+3)=0x00;
	
	printf("\n %d ",sizeof(a));
	printf("\n&a=%x",&a);
	printf("\na=%e",a);


}



咱們看到結果爲 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,這是咱們想要的結果!
相關文章
相關標籤/搜索