Answers:
这意味着每个号码被表示为1.xxx XXX XXX XXX XXX XXX XXX XX一些功率的2,其中每个X是一个二进制数字,0或1(配极小非规格化数的例外小于倍 -它们以0开头,而不是1。但是接下来我将忽略它们)
因此,在和的范围内,您可以表示精度为± 2 (i − 24 )的任何数字。
In this range: You get accuracy within:
-----------------------------------------------
0.25 - 0.5 2^-26 = 1.490 116 119 384 77 E-08
0.5 - 1 2^-25 = 2.980 232 238 769 53 E-08
1 - 2 2^-24 = 5.960 464 477 539 06 E-08
2 - 4 2^-23 = 1.192 092 895 507 81 E-07
4 - 8 2^-22 = 2.384 185 791 015 62 E-07
8 - 16 2^-21 = 4.768 371 582 031 25 E-07
16 - 32 2^-20 = 9.536 743 164 062 5 E-07
32 - 64 2^-19 = 1.907 348 632 812 5 E-06
64 - 128 2^-18 = 0.000 003 814 697 265 625
128 - 256 2^-17 = 0.000 007 629 394 531 25
256 - 512 2^-16 = 0.000 015 258 789 062 5
512 - 1 024 2^-15 = 0.000 030 517 578 125
1 024 - 2 048 2^-14 = 0.000 061 035 156 25
2 048 - 4 096 2^-13 = 0.000 122 070 312 5
4 096 - 8 192 2^-12 = 0.000 244 140 625
8 192 - 16 384 2^-11 = 0.000 488 281 25
16 384 - 32 768 2^-10 = 0.000 976 562 5
32 768 - 65 536 2^-9 = 0.001 953 125
65 536 - 131 072 2^-8 = 0.003 906 25
131 072 - 262 144 2^-7 = 0.007 812 5
262 144 - 524 288 2^-6 = 0.015 625
524 288 - 1 048 576 2^-5 = 0.031 25
1 048 576 - 2 097 152 2^-4 = 0.062 5
2 097 152 - 4 194 304 2^-3 = 0.125
4 194 304 - 8 388 608 2^-2 = 0.25
8 388 608 - 16 777 216 2^-1 = 0.5
16 777 216 - 33 554 432 2^0 = 1
因此,如果您的单位为米,您将失去16 484-32 768波段(距原点约16-33公里)的毫米精度。
通常认为您可以通过使用其他基本单位来解决此问题,但这不是真的,因为相对精确度很重要。
如果使用厘米为单位,则会在1 048 576-2 097 152波段(距原点10-21公里)处失去毫米精度。
如果我们以公厘为单位,则会在128-256波段(距原点13-26公里)处失去毫米精度
...因此将单位更改为四个数量级仍然会导致数十公里范围内的毫米精度损失。我们要转移的只是它击中该频段的确切位置(由于base-10编号与base-2编号之间的不匹配)不会大幅扩展我们的可玩区域。
您的游戏所能容忍的不准确程度取决于您的游戏玩法,物理模拟,实体大小/绘制距离,渲染分辨率等细节,因此设置精确的临界值非常棘手。可能是您的渲染看起来与原点相距50公里,但子弹正在穿过墙壁传送,或者敏感的游戏脚本变得混乱。或者,您可能会发现游戏进行得很好,但是由于摄影机转换的不准确,一切都几乎无法察觉。
如果您知道所需的精度水平(例如,0.01个单位的跨度在您的典型查看/互动距离处映射为大约1 px,并且看不到任何较小的偏移量),则可以使用上表查找丢失的位置精度,并在有损操作的情况下将安全性降低几个数量级。
但是,如果您根本就在考虑远距离,最好通过在玩家移动时重新定义您的世界来回避所有这些。在原点周围选择一个保守的小正方形或立方体形区域。每当玩家移动到该区域之外时,请将其以及世界上的所有内容平移该区域一半的宽度,从而将玩家保持在内部。由于一切都一起进行,因此您的播放器不会发生变化。误差仍然可能发生在世界的偏远地区,但是与在脚下发生的误差相比,误差通常不那么明显,并且可以保证始终在播放器附近提供高精度。
这很难回答,因为它取决于你的物理规模:什么是可接受的最小移动速度,需要不进行四舍五入,以零?
如果您需要广阔的世界和一致的物理学,最好使用定点类。
例如,在世界任何地方射击炮弹都会为您带来相同的结果,而64位固定点(32.32)则为您提供了巨大的精度,这比大多数游戏中所能感知的要多。如果您的单位是1米,那么您离原始点的距离仍为232皮秒,精度为2147483km。
您仍然可以在本地单元中的浮点中进行本地物理操作,以节省编程工作并使用现成的物理引擎。对于所有实际目的,它仍将合理地保持一致。
作为奖励,由于FPU延迟,宽相和AABB在定点趋于更快。将固定点转换为八叉树(或四叉树)索引的速度也更快,因为您可以执行简单的位掩码。
这些操作不能从通常会隐藏FPU延迟的SIMD指令和流水线中受益。
您可以将位置转换为浮点,然后再减去相机在固定点的位置以渲染所有内容,避免在大型环境中出现浮点问题,并且仍使用使用浮点的常规渲染器。