双精度坐标
在某些情况下,您需要计算非常大的数字(例如,空间中的距离),或者相反,需要计算非常小的数字(例如,微观中的距离)。在这方面,Unigine具有64位双精度浮点格式(而不是32位单精度浮点格式)来定义虚拟场景中对象的坐标。因此,可以创建几乎没有限制的高度详细的世界(最大坐标值实际上是32位浮点精度的536,870,912倍)。
实际上,由于定位误差的累积,即使在大于10x10 km的场景上,浮动精度限制也很明显,因此对于较大的任何物体都应使用双精度,以保持精度。
单精度与双精度#
在计算中,浮点是一种通过尾数和指数表示实数的方法:
mantissa × base ^ exponent ,
其中基等于 2 。
IEEE浮点算术标准(IEEE 754)是用于浮点精度和双精度浮点格式的技术标准。单精度浮点格式占用32位(4字节),双精度浮点格式占用64位(8字节)。两种情况的数字格式如下图所示:
其中:
- S-符号( 0 -正; 1 -负)
- E-指数(单精度为 127 ,双精度为 1023 )
- m - 尾数 [1;2]
浮点格式(单点和双点)的分布是次正态的。例如,我们有-1 ≤ E ≤ 2:
单精度和双精度的可能值范围以及最小可能的灰度如下图所示。
- 值范围:[-10^9;+10^9]。较低和较高的值将显示为 inf。
- 小数部分中数字的最大数量不能超过3。
通过UnigineScript函数设置的值仅具有格式限制。
失误#
使用单精度浮点格式会导致如下所示的计算错误。
定位误差#
单精度浮点中可能的刻度之间的较大距离会导致定位错误。下图以示意图形式演示了使用单精度和双精度时的定位:
在虚拟场景中,对象转换(包括定位,旋转和缩放),动画和物理实现会导致定位错误,进而导致对象抖动。为避免此问题并提供更精确的定位,请使用双精度浮点坐标。此外,定位错误可能导致顶点塌陷,如下图所示。
错误累积#
由于IEEE 754格式的数字表示一个有限的集合,在该集合上传输了无限的实数集合,因此输出值可能包含表示精度误差,这在进一步的计算中会导致误差累积。错误的功能如下所示:
一个数字的最大绝对误差等于可能的灰度的一半。当指数增加时,可能的灰度会加倍,因此误差也会增加。
对于单精度数字,数字的等级等于2 ^ (E-150),对于双精度数字,数字的等级等于2 ^ (E-1075)。
让我们比较单精度数字和双精度数字的 1 值。
单精度 | 双精度 | |
---|---|---|
数字(十进制) | 1.0 | 1.0 |
IEEE754(十六进制) | 3F800000 | 3FF00000 00000000 |
绝对误差(十进制) | 2 -23 ≈1.192 * 10 -7 | 2 -52 ≈2.220446 * 10 -16 |
相对误差, % | 11.9209 * 10 -6 | 2.220446 * 10 -14 |
根据分布,灰度值增加,导致误差增加。但是相比之下,双精度数字错误要比单精度数字错误小很多倍。