首頁 游戲

Minecraft指令手冊

第一百三十七章 真正深入了解NBT-3

Minecraft指令手冊 你好MC 2038 2020-10-25 22:38:50

  在上一章,我們講完了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ù)點,但最好要加上。

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設置
設置
書架
加入書架
書頁
返回書頁
指南