第一百三十七章 真正深入了解NBT-3
在上一章,我們講完了NBT數(shù)據(jù)類型中數(shù)值類型中的整形形式。按照作者我歸納的:
[字符]
字符串(String)
[數(shù)值]
{整形}
字節(jié)型(Byte:B)
短整型(Short:S)
整型(Int:I)
長整型(Long:L)
{浮點型(小數(shù))}
單精度浮點型(Float:F)
雙精度浮點型(Double:D)
[數(shù)據(jù)]
復合標簽(Compound)
列表(List)
[數(shù)組]
字節(jié)型數(shù)組(Byte Array:[B])
整型數(shù)組(Int Array:[I])
長整型數(shù)組(Long Array:[L])
接下來就應該是小數(shù)(浮點數(shù))了。
小數(shù)有兩種數(shù)據(jù)類型,這兩種類型我們都已經(jīng)在之前的章節(jié)接觸過,即:
單精度浮點型(Float:F)
雙精度浮點型(Double:D)
在第一百三十二章,作者就講過單精度浮點型和雙精度浮點型的占用空間,即:
單精度浮點型——占用空間:32位(4字節(jié))
雙精度浮點型——占用空間:64位(8字節(jié))
同時我也提了這兩個類型的數(shù)值范圍:
單精度浮點型:-3.4×103?~3.4×103?
雙精度浮點型:-1.79769313486232×103??~1.79769313486232×103??
經(jīng)過了上一章的了解,我們已經(jīng)知道同樣是32位占用空間的Long長整形,它的數(shù)值范圍達到了:
-(2?3)~2?3-1
即:-922'3372'0368'5477'5808~922'3372'0368'5477'5807
但單精度浮點型卻達到了:
-340'0000'0000'0000'0000'0000'0000'0000'0000'0000~340'0000'0000'0000'0000'0000'0000'0000'0000'0000(負三百四十澗至三百四十澗[注:一澗為萬溝,一溝為萬穰,一穰為萬秭,一秭為萬垓,一垓為萬京])
為什么在相同的存儲空間下,Long長整形的數(shù)值范圍才達到京的程度,而Float單精度浮點型的數(shù)值范圍卻已經(jīng)達到了澗的程度了呢?這到底是人性的扭曲還是道德的淪喪?
這還沒完。我們知道,整數(shù)它規(guī)定一個最大范圍,正負整數(shù)就都有其自己的最大值和最小值了。但小數(shù)不一樣,你規(guī)定一個最大值,但它還可以無限增加它的小數(shù)位數(shù),如:
1.76×10????????????????
這數(shù)雖然很小,但小到小數(shù)位數(shù)就有999'9999'9999'9999將近千兆位了。如果要表示這串數(shù)字,光是4B的空間是絕對不夠的。所以,浮點數(shù)數(shù)值類型也有其自己的小數(shù)位數(shù)最大值:
單精度浮點型:45位小數(shù)位數(shù)
雙精度浮點型:45位小數(shù)位數(shù)
看來小數(shù)位最大值都一樣嘛。
剛才我們提了兩個問題:
1.為什么在相同的空間下,Long長整形的數(shù)值范圍才達到京的程度,而Float單精度浮點型的數(shù)值范圍卻已經(jīng)達到了澗的程度了呢?
2.這到底是人性的扭曲還是道德的淪喪?
首先我們來解答第一個問題。
其實,不管是什么浮點數(shù),管他是單精度、雙精度還是三精度,它們都有一個標準,這個標準就是:IEEE 754-2008(IEEE二進位浮點數(shù)算術標準)
這個標準規(guī)定了很多東西,想深入了解的話可以去百度百科上,這里就不細講了。
其中,最重要的也是最簡單的莫過于一個公式:
Value=sign bit×exponent bias×fraction
即一個浮點數(shù),等于符號位乘以指數(shù)偏移值再乘以分數(shù)值。
看不懂是吧?其實,浮點數(shù)的表示方法就是用到了我們在學前班就學到過的“科學計數(shù)法”。
比如我們的單精度浮點型,它的32個位分別是:
0'00000000'00000000000000000000000
?。ǚ栁?1)'(階碼:8)'(尾數(shù):23)
看來還是看不懂啊。算了,總之,是因為浮點數(shù)采用了科學計數(shù)法的方式來存儲,才可以在32位的空間內塞入這么大的數(shù)值。
這就是第一個問題的答案。
第二個問題的答案就非常簡單了,是:無法確定,因為人類的情緒是無法用語言準確表達出來的,最多也只能表達個大概。
現(xiàn)在我們知道浮點數(shù)使用的是科學計數(shù)法來存儲。這種存儲方法有利也有弊:利在于可存儲數(shù)值的范圍擴大了很多;但弊也有,就是能準確存儲的數(shù)值范圍縮小了。
啥意思呢?剛才說過,Long長整形的數(shù)值范圍是:
-922'3372'0368'5477'5808~922'3372'0368'5477'5807
在這個范圍內,存儲的數(shù)值都是非常準確的,不會你給了個在這個范圍內的數(shù),計算機就在后臺為了方便給你這個數(shù)四舍五入或者砍了幾個0。因此,我們就把這個Long長整形的數(shù)值范圍又叫做Long長整形的有效數(shù)值范圍。
但浮點數(shù)就不一樣了,由于使用科學計數(shù)法存儲,導致數(shù)值范圍看起來很大,但實際有效數(shù)值范圍只有那么一點點:
單精度浮點型:7位(整數(shù))
雙精度浮點型:16位(整數(shù))
對比一下Long長整形的有效數(shù)值范圍:19位(整數(shù))
哦天哪!這浮點數(shù),就像是MC的真區(qū)塊和假區(qū)塊一樣——別看MC邊長可以達到21'4748'3647×21'4748'3647,實際上有效游玩范圍只有2999'9999×2999'9999,出去了就各種BUG、特性、崩壞,可能時不時還跳出個桌面。
這就告訴了我們一個人間真理:
很多時候,國產(chǎn)游戲廣告的內容看起來很牛逼,實際上真實游戲內容只有宣傳其中的1%都不到。
嗯,這很資本家。
好了,回到正題。我們目前已經(jīng)知道了兩個浮點型的數(shù)值范圍、小數(shù)位數(shù)最大值、有效數(shù)值范圍和占用存儲空間。但別忘了,很多NBT數(shù)據(jù)類型都有類型字母的,我們的兩個浮點型也不例外,都有自己的字母:
單精度浮點型:f
雙精度浮點型:d
具體用法就不再多說了。
我們知道,浮點數(shù)是可以表示整數(shù)也可以表示小數(shù)的。那么在表示整數(shù)時,我們要不要加上小數(shù)點呢?
答案是加不加都可以,當然最好是加上。
總而言之,兩個浮點型的特性分別是——
單精度浮點型:
1.數(shù)值范圍為-3.4×103?~3.4×103?
2.占用空間32位(4字節(jié))
3.使用IEEE 754-2008標準
4.小數(shù)位數(shù)最大值位45位
5.有效數(shù)值范圍為7位整數(shù)
6.類型字母位f
7.小數(shù)部分都為0時(即值為整數(shù)),可不加小數(shù)點,但最好要加上。
雙精度浮點型:
1.數(shù)值范圍為-1.79769313486232×103??~1.79769313486232×103??
2.占用空間64位(8字節(jié))
3.使用IEEE 754-2008標準
4.小數(shù)位數(shù)最大值位45位
5.有效數(shù)值范圍為16位整數(shù)
6.類型字母位d
7.小數(shù)部分都為0時(即值為整數(shù)),可不加小數(shù)點,但最好要加上。