对于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