故事开始于Unity Doc中关于Half的进度的解释
Medium precision: half
Medium precision floating point value; generally 16 bits (range of –60000 to +60000, with about 3 decimal digits of precision).Half precision is useful for short vectors, directions, object space positions, high dynamic range colors.
不知是人入中年,还是隔得太久,早已把一些基础的东西忘却了。看到这里关于精确的描述,感觉有点不可思议,16bit,最多也就2的16次方=65535中可能性,怎么能表示这么大的范围呢?后面经过Google的脑补,才明白过来,因为float的有损,才使得这个成为可能,而float精辟的地方也就在表示的每个数字的时候,误差相对于它的绝对值都是很小的,即大数误差较大,小数误差较小。这里备忘一下。
IEEE 754 标准指定了一个 binary16 要有如下的格式:
- Sign bit(符号位): 1 bit
- Exponent width(指数位宽): 5 bits
- Significand precision(尾数精度): 11 bits (有10位被显式存储)
按如下顺序排列:
除非指数位全是0,否则就会假定隐藏的起始位是1。因此只有10位尾数在内存中被显示出来,而总精度是11位。据IEEE 754的说法,