単精度浮動小数点

ソサ(マジックユーザ)の謎の加算値

昨日の日記に書いたことについてもう一度整理してみる。

  • Lv 4 ~ Lv 17までは、謎の加算値は、 0.4*(Lv+30) という式で表せると、かなり高い確信を持って言える。
  • クニペックスさんのデータを分析すると40ソサでは28、76ソサでは42.4と推測できるけれど、これもやはり0.4*(Lv+30)という式とマッチしている。
  • ところが Lv 18では、0.4*(18+30)=19.2 とならずに、これよりわずかに大きい値であるという結論になってしまった。

今日はこの理由について考えてみる。

結論

すごく話が長く、込み入ってしまったので、結論を先に。

  • これは、多分バグ(の一種)
  • ロードスで扱われる数値は、有効数字は7桁程度しかないと思った方が良い。

昨日の測定

昨日の日記で、Lv 18 での謎の加算値が19.2より大きいという結論に至ったのは、こんな測定からだった。

知力: 11
基礎倍率: 0.7*(1+0.06*11)=1.162
基礎攻撃力: 31
武器習熟: +2
武器攻撃力: 66
攻撃力増: 15% + 19.8%
スキル攻撃力上昇: 3

という状態で、イグニッション(Lv6) (スキル倍率 4.25) の攻撃力を測定する。

もし謎の加算値が 19.2 ならば、イグニッションの攻撃力を表す式は

4.25*1.162*((31+2+66+19.2)*(1+0.15+0.198)+2*3) = 816.4999836

となり、これを四捨五入して 816 となるはず。ところが、実際に調べてみると 817 だった。
それなので、昨日は「謎の加算値は19.2より大きくなければならない」と結論付けた。

考え方を変える

けれど、今日は「本来は816のはずが、バグで817になってしまった」と考えてみる。
そうすると、いろいろなことがつじつまが合ってくる。

単精度浮動小数

コンピュータで小数を表す方法はいくつかあり、その中の一つに「単精度浮動小数点」と呼ばれるものがある。これはieee 754で規格が定められており、この方法で816.4999836
という値を表そうとすると、実は丸められて816.5になってしまう。
そのカラクリはこんな感じ: wikipedia
単精度浮動小数点数 - Wikipedia
ここの説明通り2進展開を考えてみると

816.4999836 = 1.1001100000111111111111110.... * 2^9

となる。ここで後ろに1が14個続くのがポイント。ieeeの規格によって、この2進展開の青い部分までしか保持できず、はみ出た部分を「0捨1入」する。すると

= 1.1001100001 * 2^9

という値になる。これが実は、816.5という値

そして、ロードスのスキル攻撃力のルールにより、この値を四捨五入したもの、すなわち817が最終的な攻撃力になる。

つまり、計算の途中でieee 754による丸め処理があったと仮定すると、イグニッションの攻撃力が817となった理由が説明できたことになる。

丸め処理を2回行う

結局これは、丸め処理を2回行ったことで生じた弊害と言える。丸め処理を2回行うとおかしなことになるのは例えば

12.45

という値があったとして、小数点以下第二位で四捨五入して

12.5

としてから、さらにこれを四捨五入すると

13

となってしまうという例でも分かる。本来12.45を正しく四捨五入すると12になるはずが値が1ずれてしまう。

まとめ

まとめるとこんな感じ

「謎の加算値が19.2なら、イグニッションの攻撃力は816となるはずなのに、実際には817になっていた」

という前提があり

  • 昨日は「謎の加算値は19.2より大きくなければいけない」という結論に至った
  • 今日は「ロードスの開発者が単精度浮動小数点を使って、丸め処理を2回行うというミスを犯したと仮定すると、謎の加算値が19.2であったとしてもつじつまが合う」という結論に至った

バグかバグではないのか

「丸め処理を2回行う」というのは、厳密な結果が求められるプログラムでは決してやってはいけないこと。けれど、ロードスはゲームなので、その辺はさほど気にせずにプログラムされたのかもしれない。

なので「初めに設計された通りに動いていない」という意味ではバグの一種だけれど
「厳密に初めの設計通りでなくてもゲーム性を損なわなければOK」という考え方をすればバグではないとも言える。

また、仮にバグと呼ぶにしても、他に数多ある致命的なバグに比べれば、大部分の人にとってどうでもいい類とも言える。

しかし、ごく一部、このゲームの内部を知ろうとする調査兵団にとっては、このバグは意識せざるを得ない存在であり、今回の事は重要な教訓となった。それは、どんな教訓で、その教訓から何が分かるのか、という話はまた後日。

マジックユーザー

謎の加算値を調べる為にマジックユーザを育てることにした。

レベルを上げながら謎の加算値を調べた結果がこちら

測定結果

Lv 4. 13.599978 < c < 13.600020
Lv 5. 14.0 <=c < 14.000023
Lv 6. 14.399993 < c < 14.400026
Lv 7. 14.799953 < c < 14.800012
Lv 8. 15.2 <=c < 15.200038
Lv 9. 15.599992 < c < 15.600010
Lv10. 15.999995 < c < 16.000023
Lv11. 16.399960 < c < 16.400015
Lv12. 16.799953 < c < 16.800012
Lv13. 17.2 <=c < 17.200038
Lv14. 17.599992 < c < 17.600010
Lv15. 17.999975 < c < 18.000024
Lv16.
Lv17. 18.799953 < c < 18.800012
Lv18. 19.200002 < c < 19.200038

感想

ID1回でレベルが15から17まで上がってしまったので、Lv16での謎の加算値は測定できなかった。
けれどこれを見る限り、0.4*(Lv+30)という式で表せそうに思える。
ところが、もしそうなら、Lv18では19.2にならないといけないはずが、Lv18では
19.200002 < c < 19.200038と、僅かながら19.2より大きい値になっている。
何故なのかは分からない。

クニペックスさんのデータ

比較

ソサのスキルの攻撃力についてクニペックスさんが詳細なデータをあげてくれている。

https://goo.gl/2lV7Sr

そこで、今までこの日記に書いた計算法で算出したスキル攻撃力の加算値と、クニペックスさんの7/11分のデータを比較してみる。76ソサの謎の加算値は分からないけれど、42.4だと仮定してみる。

条件

(主なものだけ抜粋、詳細はクニペックスさんのシートを参照)
76ソサ
知力: 19
基礎攻撃力: 5+26+5+50
スキル攻撃力上昇: 15+50+48
攻撃力上昇: 15%
武器習熟: 29

実測値

こちらはクニペックスさんのデータ
f:id:ochanikki:20170727223536p:plain

理論値

そして、こちらはこの日記で書いてきた方法で計算したもの

FB(Lv1) IA(Lv11) CL(Lv6) Ig(Lv7)
834 998 1071 2190
1090-1096 1299-1306 1402-1410 2868-2883
1123-1128 1337-1344 1444-1451 2953-2968
1163-1170 1385-1393 1496-1505 3061-3078
1158-1163 1378-1385 1489-1497 3046-3061
巧% 1195-1201 1422-1429 1538-1545 3145-3160
巧+猛 1190-1196 1416-1423 1531-1538 3131-3146
巧%+巧 1275-1280 1516-1523 1640-1648 3355-3371
Fz(Lv8) EJ(Lv5) E(Lv1) I(Lv10) 魔功
1606 1905 468 1265
2103-2114 2808-2829 611-614 1657-1666 298-302
2166-2177 2922-2942 629-632 1706-1715 317-321
2244-2257 3065-3089 651-655 1768-1779 341-345
2233-2245 2927-2947 648-652 1760-1769 298-302
巧% 2306-2318 2993-3013 669-672 1817-1826 298-302
巧+猛 2296-2307 3040-3061 666-670 1809-1818 317-321
巧%+巧 2461-2472 3133-3154 714-717 1939-1948 298-302

考察

黒字の部分は、クニペックスさんのデータと合っている。赤字は合っていないもの。EJの杖はクニペックスさんの入力ミスだと思う。そして、巧%はEJ以外すべて合っていない。なので

  • 巧%が絡まない部分については、この日記で過去に書いた計算法でほぼ間違いない
  • 巧%が絡む部分は見直しが必要

と言えそう。実は、これと同じことは、前の日記でも書いていた。

クニペックスさんの調査 - お茶の国 プリ日記 ロードス島 調査兵団

このときは、クニペックスさんの「旧1」というデータを使った。そしてやはり、EJ以外の巧%がらみは数値が合わず、それ以外は数値が合うという結果になった。

では、巧%が絡む部分についてはどう計算したらいいか、その辺の話はまた後日。

防御力下方修正

今日のメンテで、いくつかのマップで敵のステがいろいろと下方修正されたみたい。

見捨てられた国境

なので、見捨てられた国境の傭兵と山賊の物理防御力を調べてみる。
40キャラにはダメ値バグは無いはずなので、40レンを使って物理防御力を調べてみる。

結果は、山賊も傭兵も共に物理防御力770。
以前測定した時は, ともに814だったはずなので、(このときのメモが間違ってなければ)5.4%減ったことになる。

ついでに70モンクで、これらを叩いてみると、レベル63相当で計算されていることが確かめられた。

ダメ値バグはまだ残っているみたい。

ダメ値バグ その後

モンクが70になった。明日はメンテなので、改めて湖畔B3でダメ値バグを確認してみる。

実験

叩く人: 70モンク
アッパー攻撃力: 1237-1250
ダメ増(亜人): 20%
クリダメ増: 210%

叩く相手:湖畔 B3 グレムリン(亜人)
防御力: 1337

理論値

Lv=63, 65, 70の場合にアッパーのクリダメの理論値を計算しておく。こんな感じ。

Lv=63 理論値
[2343, 2345, 2347, 2349, 2350, 2352, 2354, 2356, 2358, 2360, 2362, 2364, 2366, 2367]

Lv=65 理論値
[2405, 2406, 2408, 2410, 2412, 2414, 2416, 2418, 2420, 2422, 2424, 2426, 2428, 2430]

Lv=70 理論値
[2548, 2550, 2552, 2554, 2556, 2559, 2561, 2563, 2565, 2567, 2569, 2571, 2573, 2575]

実測値

そして、実際に叩いてみると…

実測値(10回分)
2410, 2430, 2412, 2406, 2414, 2405, 2426, 2410, 2422, 2430

こんな感じ。Lv=65の時の理論値と一致している。やっぱりレベル65相当で計算されているみたい。

対人戦

ダメ値バグは、対人戦の時どうなるかも実験してみた。
結論は「対人戦ではダメ値バグはなさそう」というもの。
こちらは、モンクが69のときに実験した。

実験

叩く人: 69モンク
アッパー攻撃力: 1092
クリダメ増:180%
ダメ増(人間): 15%

実験結果1

叩かれる人: 73パラ
防御力: 857
ダメ減(人間):15%
ダメ減(物理):21.4%

バグがない場合の理論値は204。計算はこんな式。

df=857/(700.0+30*69)
0.5*( (1-df)/(1+df/5)*1092*(1-0.214)*(1.5+1.8) )**0.8=204.75

実測値は204

実験結果2

叩かれる人: 61モンク
防御力: 764
ダメ減(人間):9%
ダメ減(物理):13.8%

バグがない場合の理論値は242。計算はこんな式。

df=764/(700.0+30*69)
0.5*( (1-df)/(1+df/5)*1092*(1+0.15-0.09-0.138)*(1.5+1.8) )**0.8=242.86

実測値は242

結論

対人戦では、ダメ値バグは無いと言ってよさそう

アイスアローとエングロスメント

ソサのアイスアローとエングロスメントのスキル倍率とスキル加算値を調べてみた。
過去の日記と合わせると、ソサのスキル倍率は全て求まったことになる。

ソサの調査 - お茶の国 プリ日記 ロードス島 調査兵団
ファイアボール - お茶の国 プリ日記 ロードス島 調査兵団

アイスアロー
Lv1 Lv2 Lv3 Lv4 Lv5 Lv6 Lv7 Lv8 Lv9 Lv10
Sa 1.4 1.45 1.5 1.65 1.7 1.75 1.8 1.85 1.9 1.95
Sb0 4 5 6 7 8 9 10 11 12 13
Lv11 Lv12 Lv13 Lv14 Lv15 Lv16
Sa 2.0 2.05 2.1 2.15 2.2 2.25
Sb0 14 15 16 17 18 19
エングロスメント
Lv1 Lv2 Lv3 Lv4 Lv5 Lv6 Lv7 Lv8 Lv9 Lv10
Sa 0.95 1.05 1.15 1.3 1.45 1.6 1.75 1.9 2.05 2.2
Sb0 3 5 7 11 15 19 23 27 31 35
Lv11 Lv12 Lv13
Sa 2.35 2.5 2.65
Sb0 39 43 47

Saはスキル倍率、Sb0は知力が0のときのスキル加算値で、知力がkのときは (1+0.04*k)*Sb0となる。

ファイアボール

ソサのファイアボールのスキル倍率とスキル加算値を調べた

Lv1 Lv2 Lv3 Lv4 Lv5 Lv6 Lv7 Lv8 Lv9 Lv10
Sa 1.7 1.75 1.8 1.85 2.0 2.05 2.1 2.15 2.3 2.35
Sb0 4 5 6 7 8 9 10 11 12 13
Lv11 Lv12 Lv13 Lv14 Lv15 Lv16 Lv17 Lv18 Lv19 Lv20
Sa 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.75 2.8 2.85
Sb0 14 15 16 17 18 19 20 21 22 23
Lv21 Lv22 Lv23 Lv24 Lv25 Lv26 Lv27 Lv28 Lv29 Lv30
Sa 2.9 2.95 3.0 3.05 3.1 3.15 3.2 3.25 3.3 3.35
Sb0 24 25 26 27 28 29 30 31 32 33
Lv31 Lv32 Lv33 Lv34 Lv35
Sa 3.4 3.45 3.5 3.55 3.6
Sb0 34 35 36 37 38

Saはスキル倍率、Sb0は知力が0のときのスキル加算値で、知力がkのときは (1+0.04*k)*Sb0となる。