いい加減な丸め処理

昨日の日記で、ロードスの丸め処理がかなりいい加減なことが分かった。厳密なプログラムとしては決して許されないけれど、ゲームプログラムとしては許容範囲なのかもしれない。実は、いままでの様々な調査は、丸め処理が正しく行われているという前提で行われてきた。なので、これまでの調査結果を解釈し直さなければならない。この辺のことを整理してみる。

これまでの考察

謎の加算値を探るためのこれまでの考察は、全て「丸め処理が正しく行われている」という前提に基づいていた。今回、この前提が崩れてしまった。

今後は単精度浮動小数点の制約の中で考えなければいけない。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で割っているのが唐突で不自然に見えるかもしれないけれど、実はそんなことはない。その辺のことはまた後書く予定。