1.了解float存储结构


float存储结构请看另一篇文章


2.float最大值


float结构如下图:




float类型最大值和最小值_c



要想获得正最大值,那就令符号位为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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

结果并不和我们想的一样,出现了1.#QNAN0,这个我也不知道为什么,知道原因的可以回复!





float类型最大值和最小值_c语言_02




如果指数位最后一位为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 */
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.




当我们令指数位为: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);

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.




我们从结果可以看出


&a=12ff44
a=340282346638528860000000000000000000000.000000


这是float的最大值


float类型最大值和最小值_数位_03




4.float正最小值


float.h中我们看到float正的最小值为  1.175494351e-38F


#define FLT_MIN         1.175494351e-38F        /* min positive value */
  • 1.


及十六进制为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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.


我们得到的结果为 1.00000000 00000000 0000 01*2^-127= 5.877472454760670*10^-039,可是结果不是我们预测的!不知道为什么



float类型最大值和最小值_c++_04



如果将指数位置成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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.



float类型最大值和最小值_数位_05







我们看到结果为 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038,这是我们想要的结果!