根据测试,游戏程序是以单精度浮点数的方式来储存单位的现在生命值。详述:
Single 数据型态 Single (单精度浮点数) 变量系以 IEEE 32 位 (4 个字节) 浮点数字的形式储存,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从 1.401298E-45 到 3.402823E38。
计算机处理浮点数的公式是这样的:
z = a * 2 ^ x (-2 < a < 2)
z 是要储存的数值
例如:
要储存 1 时,则 a 为 1 ,x 为 0 。
要储存 1.5 时,则 a 为 1.5 ,x 为 0 。
要储存 2 时,则 a 为 1 ,x 为 1 。
要储存 3 时,则 a 为 1.5 ,x 为 1 。
在浮点数的 32 个字节中,有 24 个字节安排到给上列公式的 a 。故理论上可以正常储存的最大之整数应为 2^0 + 2^1 + ... + 2^23 = 16777215。(a 为 1.9999999 而 x 为 23)
然而,当 x 为 24 而 a 为 1 时(1 * 2^ 24 = 1^24),得出的答案是 16777216 ,仍然属于正确;不过在计算机换算上,我们已经视之为不精确了。
到了 16777217 又如何呢?依据上述算式,你不可能弄出一个 16777217 。
故此,游戏程序将整数 16777217 (触发事件效果数值)换算成 浮点数(现在生命值)时就会出现约简或换算的情形。
知道这一原则,我们再以一个 40 生命值的单位来说明一下回复的进行过程:
a = 摧毁目标(-) -(16777217 - 40) = +(16777177)
b = 摧毁目标(-) 16777216 - 40 = -16777176
单位起始生命值为 1/40
第 1 秒,执行 a 则 1 + 16777177 = 16177178 (正常),然后执行 b 则 16177178 - 16177176 = 2
第 2 秒,执行 a 则 2 + 16777177 = 16177179 (正常),然后执行 b 则 16177179 - 16177176 = 3
.
.
.
.
.
.
第 39 秒,执行 a 则 39 + 16777177 = 16177216 (正常),然后执行 b 则 16177216 - 16177176 = 40
第 40 秒,执行 a 则 40 + 16777177 = 16177217 (不正常,化回 16777216),然后执行 b 则 16177216 - 16177176 = 40
第 41 秒,执行 a 则 40 + 16777177 = 16177217 (不正常,化回 16777216),然后执行 b 则 16177216 - 16177176 = 40
輸入數值 輸出數值
16777216 16777216
16777217 16777216-
16777218 16777218-
16777219 16777220
16777220 16777220
16777221 16777220-
16777222 16777222-
16777223 16777224
16777224 16777224
16777225 16777224-
16777226 16777226-
16777227 16777228
16777228 16777228
16777229 16777228-
16777230 16777230-
16777231 16777232
16777232 16777232
16777233 16777232-
16777234 16777234-
16777235 16777236
16777236 16777236
16777237 16777236-
16777238 16777238-
16777239 16777240
.
.
.
.
.
.
33554424 33554424
33554425 33554424-
33554426 33554426-
33554427 33554428
33554428 33554428
33554429 33554428-
33554430 33554430-
33554431 33554432
33554432 33554432
33554433 33554432
33554434 33554432-
33554435 33554436
33554436 33554436
33554437 33554436-
33554438 33554440
33554439 33554440
33554440 33554440
33554441 33554440
33554442 33554440-
-号是区间完结
[此贴子已经被作者于2005-9-21 20:57:31编辑过]
[ 本帖最后由 狂~劇情狂 于 2009-6-19 15:34 编辑 ] |