對於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