單精度浮點(diǎn)數(shù)應(yīng)用時(shí)的最大存儲(chǔ)整數(shù)
如果搜“32位單精度浮點(diǎn)數(shù)的最大值”一般都是 3.4 * 10^38。
Q:看著感覺能存很大的值,至少百億千億無(wú)所謂?還有很多位的盈余。
A:其實(shí)存?zhèn)€千萬(wàn)都費(fèi)勁,因?yàn)檎麛?shù)部分的值丟失是難以接受的。
????執(zhí)行以下代碼得(C# for Unity)
用unity是因?yàn)檩敵龇椒ㄗ疃套詈?jiǎn)單(

以上,
賦值2^23的爆金幣了,
賦值2^23-1的爆金幣了,
賦值2^23+1的對(duì)了,
得2^23的乘法對(duì)了,
得2^24的乘法爆金幣了。

初看 3.4 * 10^38是很難琢磨的一個(gè)值 因?yàn)樗鼏渭兪?2^128 結(jié)果的十進(jìn)制轉(zhuǎn)述。
廣義的浮點(diǎn)數(shù)是小數(shù)點(diǎn)任意位置的,即 10可以表示為:10^1 * 1、也可以為10^2 * 0.1。
被float、double等定義的浮點(diǎn)數(shù)是IEEE提供的一個(gè)大家遵循的表示標(biāo)準(zhǔn),這里的位分配即是IEEE對(duì)float提供的標(biāo)準(zhǔn)。
32位的浮點(diǎn)數(shù)的位分配:1個(gè)符號(hào)(S),8個(gè)階碼(E),23個(gè)尾數(shù)(bn)
(1) 符號(hào)
????0正數(shù),1負(fù)數(shù)沒(méi)什么好說(shuō)的。
(2) 階碼
??? ① E ∈ [-126,127]
????Q:E為什么屬于這個(gè)區(qū)間?
????A:上文提及,浮點(diǎn)數(shù)中為階碼(指數(shù))提供了八位
????????在IEEE標(biāo)準(zhǔn)中,E要+127 即 + 0111 111,[-126,127] + 127之后為[1,254]。
????????對(duì)應(yīng)到二進(jìn)制是[0000 0001, 1111 1110],然后0和255保留用來(lái)做其他的事情。
??? ② 我在寫文的時(shí)候還看有:
????Q:為什么float的最大值不是6.8x10^38(2^129)而是3.4x10^38(2^128)。
????A:轉(zhuǎn)為二的指數(shù)就明確一些了,float存不住2^128,到E=128就爆了,即階碼1111 1111,
??????? 上文已經(jīng)說(shuō)過(guò)255被保留有特殊含義(表示無(wú)窮),尾數(shù)能提供一個(gè)最大不超過(guò)2的值,
????????????2^127 x 2 = 2^128。
(3) 尾數(shù)
?? 上文提到,尾數(shù)最大不超過(guò)2。
?? 那么再想一下數(shù)學(xué)上的科學(xué)計(jì)數(shù)法,一個(gè)數(shù)也會(huì)被歸正為10^n * z.zzz(Z∈[0,9]正整數(shù)),這樣的一個(gè)數(shù)。例如123.456 = 10^2 * 1.23456。
????對(duì)尾數(shù)的處理就像這樣。
??? 規(guī)格化:
????????計(jì)算機(jī)中對(duì)數(shù)的處理都是二進(jìn)制的,首先要把十進(jìn)制數(shù)轉(zhuǎn)為二進(jìn)制數(shù)。
????????本篇幅以0.0625為例子。
??????? ① 十進(jìn)制轉(zhuǎn)二進(jìn)制 (0.0625)10 = (0 點(diǎn) 0001)2
????????????點(diǎn):這個(gè)點(diǎn)是浮點(diǎn)的表達(dá)。
??????????? ????當(dāng)0.x時(shí),點(diǎn)在第二位之前,當(dāng)為2.x時(shí)(10 點(diǎn) 0000) = 點(diǎn)就在第三位之前了。
????????????小數(shù)部分計(jì)算二進(jìn)制:
????????????????值不斷檢測(cè)去商余2^n(n<0)。
??????????????? 例如在本例: 0.0625 / 0.5(2^-1) = 0……0.0625,和整數(shù)部分的運(yùn)算邏輯是相同的。
????????② 規(guī)格化處理:
????????????????就像二進(jìn)制的科學(xué)計(jì)數(shù)法:0 .0001 = 2^-4 * 1.000
????????????????補(bǔ)到去除1.000的1,然后對(duì).000 補(bǔ)0到23位。
????????最后0.0625的編碼為0 (127-4)10 0*23。
????????在上文的規(guī)格化處理時(shí),直接去了二進(jìn)制科學(xué)計(jì)數(shù)法之后的點(diǎn)前值1,因?yàn)樗厝皇?。
????????????對(duì)于一個(gè)非0的數(shù),二進(jìn)制科學(xué)計(jì)數(shù)法就是去找它從左到右的第一個(gè)1。
????????????對(duì)于0,浮點(diǎn)數(shù)使用 階碼和尾數(shù) 全為0表示。
????????????既然是必然的,那就沒(méi)有必要存儲(chǔ)。
????整數(shù)值丟失:規(guī)格化處理就是整數(shù)值丟失的地方。
????????很好解釋,你有100位的1,最后也只能存24位1(包括上文說(shuō)的丟棄的1和23位1)。
????????存入的時(shí)候丟棄1,讀取的時(shí)候按階碼補(bǔ)0,數(shù)據(jù)自然就丟失了。
????最后可能有小迷糊疑惑32位的數(shù)怎么整的大于32的位數(shù),這個(gè)位置是CPU提供的。