float类型最大值和最小值
来源:互联网 发布:张继科直播软件 编辑:程序博客网 时间:2024/05/22 13:21
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
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,这是我们想要的结果!
- float类型最大值和最小值
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- Java基本类型 最小值 和 最大值
- C++类型的最小值和最大值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- int float double 最大值,最小值
- C#类型最大值,最小值
- OCP-1Z0-051-V9.02-168题
- Qt:&OpenCV—Q图像处理基本操作(Code)
- python中string的操作函数
- ACM-uva10010
- 类加载
- float类型最大值和最小值
- ZOJ 1048 Financial Management
- android全屏的两种方法
- ACM-uva10361
- IOS UITextField
- 交通灯管理系统
- 安卓mysql的JDBC驱动
- OCP-1Z0-051-V9.02-169题
- 提高编程能力的10种方法