第149章真正深入了解NBT-3
在上一章,我们讲完了nbt数据类型中数值类型中的整形形式。按照作者我归纳的:
[字符]
字符串(string)
[数值]
{整形}
字节型(byte:b)
短整型(short:s)
整型(int:i)
长整型(long:l)
{浮点型(小数)}
单精度浮点型(float:f)
双精度浮点型(double:d)
[数据]
复合标签(compound)
列表(list)
[数组]
字节型数组(bytearray:[b])
整型数组(intarray:[i])
长整型数组(longarray:[l])
接下来就应该是小数(浮点数)了。
小数有两种数据类型,这两种类型我们都已经在之前的章节接触过,即:
单精度浮点型(float:f)
双精度浮点型(double:d)
在第一百三十二章,作者就讲过单精度浮点型和双精度浮点型的占用空间,即:
单精度浮点型——占用空间:32位(4字节)
双精度浮点型——占用空间:64位(8字节)
同时我也提了这两个类型的数值范围:
单精度浮点型:-3.4x10³⁸~3.4x10³⁸
双精度浮点型:-1.79769313486232x10³⁰⁸~1.79769313486232x10³⁰⁸
经过了上一章的了解,我们已经知道同样是32位占用空间的long长整形,它的数值范围达到了:
-(2⁶³)~2⁶³-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长整形的数值范围才达到京的程度,而float单精度浮点型的数值范围却已经达到了涧的程度了呢?这到底是人性的扭曲还是道德的沦丧?
这还没完。我们知道,整数它规定一个最大范围,正负整数就都有其自己的最大值和最小值了。但小数不一样,你规定一个最大值,但它还可以无限增加它的小数位数,如:
1.76x10⁻⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹
这数虽然很小,但小到小数位数就有999'9999'9999'9999将近千兆位了。如果要表示这串数字,光是4b的空间是绝对不够的。所以,浮点数数值类型也有其自己的小数位数最大值:
单精度浮点型:45位小数位数
双精度浮点型:45位小数位数
看来小数位最大值都一样嘛。
刚才我们提了两个问题:
1.为什么在相同的空间下,long长整形的数值范围才达到京的程度,而float单精度浮点型的数值范围却已经达到了涧的程度了呢?
2.这到底是人性的扭曲还是道德的沦丧?
首先我们来解答第一个问题。
其实,不管是什么浮点数,管他是单精度、双精度还是三精度,它们都有一个标准,这个标准就是:ieee754-2008(ieee二进位浮点数算术标准)
这个标准规定了很多东西,想深入了解的话可以去百度百科上,这里就不细讲了。
其中,最重要的也是最简单的莫过于一个公式:
value=signbitxexponentbiasxfraction
即一个浮点数,等于符号位乘以指数偏移值再乘以分数值。