浮点数的表示范围计算

对于C语言来说,其浮点数类型是以下两种表示:

类型 占用存储空间 表述范围
float 4字节 -3.403E38~3.403E38
double 8字节 -1.798E308~1.798E308

其浮点数各自表述范围的计算,看一下各个位的定义就行。32位的浮点数是1位符号位+8位指数位+23位底数位

最大最小值的话对应都是绝对值最大的情况。8位指数位里255被保留,最大只能取到254,移码的偏移量是+127,也就是说254表示的是2127。23位底数位全是1的话,是二进制的1.111…111(小数点后23个1),也就是“1后面24个0”减去1再右移23位。

那么这个最大的绝对值对应的就是((((1 << 24) - 1) << 127) >> 23) = ((1 << 24) - 1) << 104

In[1]:= (224 - 1) x 2104

out[1]:= 3.40282 x 1038 

 

同理:64位的浮点数是1位符号位+11位指数位+52位底数位,11位指数位里2047被保留,最大只能取到2046,移码的偏移量是+1023,也就是说2046表示的是21023。52位底数位全是1的话,是二进制的1.111…111(小数点后52个1),也就是“1后面53个0”减去1再右移52位。

那么这个最大的绝对值对应的就是((((1 << 53) -1) << 1023) >> 52) = ((1 << 53) - 1) << 971

In[1]:= (253 - 1) x 2971

out[1]:= 1.79769 x 10308

 

上一篇:F. Mattress Run 题解


下一篇:二进制与十进制间的转换方法(图文教程)