いい加減な丸め処理
昨日の日記で、ロードスの丸め処理がかなりいい加減なことが分かった。厳密なプログラムとしては決して許されないけれど、ゲームプログラムとしては許容範囲なのかもしれない。実は、いままでの様々な調査は、丸め処理が正しく行われているという前提で行われてきた。なので、これまでの調査結果を解釈し直さなければならない。この辺のことを整理してみる。
これまでの考察
謎の加算値を探るためのこれまでの考察は、全て「丸め処理が正しく行われている」という前提に基づいていた。今回、この前提が崩れてしまった。
今後は単精度浮動小数点の制約の中で考えなければいけない。wikipediaによると、単精度の浮動小数点はおおよそ7桁くらいしか有効数字がないらしい。となると、
ロードス内部で行われている計算の有効数字は7桁程度と考えた方が良い
という教訓が得られる。また、桁落ちが生じる計算については、これよりさらに有効数字が落ちる可能性がある。
モンクの謎の加算値
例えば、モンクの謎の加算値について、これまでこんな結論が得られていた。
65 | 31.5714 | |
66 | 31.9424 | +0.3710 |
67 | 32.3142 | +0.3718 |
68 | 32.6857 | +0.3715 |
69 | 33.0570 | +0.3713 |
この値の最後の桁は、(桁落ちによって)信頼性がほとんどない値になっている可能性が高い。そして、むしろその方が自然な解釈が可能になる。
もし、最後の桁が本当に正しいなら、謎の加算値はレベルの一次関数ではないことになる。しかし、逆に最後の桁の信憑性が怪しいなら、謎の加算値がレベルの一次関数である可能性が出てくるし、そうであるほうがゲーム設計的に自然。
仮に、最後の一桁の信憑性が低いとすると、モンクの謎の加算値を表す式として
(2.6/7)*(Lv+20)
というものが有力候補に挙がる。実際に比較してみるとこんな感じ
Lv | 測定値 | (2.6/7)*(Lv+20) |
---|---|---|
65 | 31.5714 | 31.571428 |
66 | 31.9424 | 31.942857 |
67 | 32.3142 | 32.314285 |
68 | 32.6857 | 32.685714 |
69 | 33.0570 | 33.057142 |
確かに2ヵ所程値が外れてしまっているけれど、最後の桁の信憑性が低いと思えば、大まかには合っている。許容範囲。
そこで、この式に基づいて、Lv=70, 71での謎の加算値を計算してみると
Lv | (2.6/7)*(Lv+20) |
---|---|
70 | 33.4285714 |
71 | 33.8 |
となる。特に、Lv=71の時は、キリの良い値になると予想できる。もし、これら予想が当たっていたら、謎の加算値の数式は(2.6/7)*(Lv+20)で確定したと言ってよさそう。その場合、「謎の加算値」とは呼ぶのはもはや相応しくないので、例えば「職業加算値」とでも呼ぶことにした方が良さそう。
ここで7で割っているのが唐突で不自然に見えるかもしれないけれど、実はそんなことはない。その辺のことはまた後書く予定。