计算机没有减法运算机制,减法转换为加法进行运算处理,整型数据以补码的形式存储。而浮点型数据采用科学计数的方式存储,与整型数据存储方式不同,采用EEE754标准进行存储,将特定长度的连续字节的所有二进制位分割为特定宽度的符号域、指数域和尾数域三部分,对应保存浮点型数值的符号、指数和尾数,通过尾数和可调节的指数就可以表达给定的数值。浮点型数据分为单精度和双精度,即float和double,float在内存中占4个字节(32位),double在内存中占8个字节(64位),存储格式如下:
file:///c:/users/ADMINI~1.WIN/appdata/roaming/360se6/USERDA~1/Temp/%E6%97~1.JPG
以float数据为例,float的指数表达范围为0~2^8(即0~255),由于指数存在正数和负数,而指数域只存正数,引入一个指数偏移值bias,IEEE 754规定指数偏移值为2^e-1 -1,e为存储指数的比特的长度,float的存储长度为8位,因此float的指数偏移值为2^7-1 -1=128-1=127,输入的指数真值加上bias后存储在指数域,因此指数真值为指数域正值(0-255)减去bias,指数的范围为(-127~128),-127在指数域的存储二进制代码为:00000000,128在指数域存储二进制代码为:11111111,但因在计算机运算时会出现负数开平方根、正无穷、有符号的0等情况,-127和128作为浮点数据运算的特殊值数值(如下图所示),因此指数的范围(为(-126~127)。
确定完指数域的取值范围后,在确定尾数的取值范围,尾数的最大值为1.1111111...(小数点后24个1),因此整个float数据的最大值为:1.111111111(小数点后24个1)*2^127,但此处无法计算,需将1.1111111...(小数点后24个1)转化为十进制数,1.1111111...(小数点后24个1)=2^0+2^(-1)+2^(-2)+...+2^(-24)=1.9999999....,约等于2,因此最大值为2*2^127=2^128=3.4*10^38
同理尾数最小值为:1.0000000(23个0)1,明显约等于1,因此最小值为1*2^-126=1.18*10^(-38)
上述情况仅针对正数,对实数域而言,最小值为-3.4*10^38,与谭浩强老师的-3.4*10^(-38)不符,但找不出不对地方,求高手解答。
|
|