ずっと誤差をなんとかしたいと思っていたけど、難しそうです。
今日手伝ってもらってデスカロシューターで実験した結果からの推測ですが・・・。
計算の話なので興味ない人はスルーで(‘-‘;
ミトラスフィアの攻略には全くもって使えない知識です。たぶん。
まず今日起きたおかしな出来事から説明します。
デスカロシューターで見つけた異変?
デスカロシューターの反動ダメージを計算するために今日実験したのですが、
SLv1 / 最大HP 9950 / 反動ダメージ 1989
SLv2 / 最大HP 9950 / 反動ダメージ 1890
SLv3 / 最大HP 10000 / 反動ダメージ 1800
SLv4 / 最大HP 10000 / 反動ダメージ 1699
SLv5 / 最大HP 10000 / 反動ダメージ 1599
SLv3からHP10000に合わせてもらいました。
これは、約20%、19%、18%、約17%、約16%と推移しています。
反動が1%ずつ減るんだろうな、と推測できると思います。
もし、20%から1%ずつ減ったとすると…。
SLv2と3は一致し、正しそうに見えますが、
SLv1は1990、SLv4は1700、SLv5は1600となるはずです。
しかし、19.9999…%から1%ずつ減ったとすると…。
SLv2と3が1不足し、1と4と5がぴったりになります。
そもそもそんな半端な数値を設定していると思えません。
(ミトラの計算式はすごくシンプルで綺麗な数値ばかりです。)
すごく複雑な式にでもしない限り、
どうしても普通に計算してはこういう結果にはならないのです。
誤差の理由
しかし、私にはここで思い当たる節があり、確認してみました。
と、いうのもステータス計算機で起きる誤差に似ているのです。
そこで思いついたのがこれ。
例えばJavaScriptで次の計算式を計算すると、こんな結果になります。
0.21 – 0.01 = 0.19999999999999998
0.21 – 0.02 = 0.19
0.21 – 0.03 = 0.18
0.21 – 0.04 = 0.16999999999999998
0.21 – 0.05 = 0.15999999999999998
ネットで適当に「js 計算機」とかで検索すると出てくるので試せば同じ結果がみれます。(高性能なものはこんな風にはなりませんが…。)
そして、パッとこの結果を見てピンときた人もいると思います。
反動ダメージ=最大HP×(0.21-0.01×SLv)
とし、赤字のところをjs特有の誤差アリで計算すると…
なんと、完全に一致します(‘-‘;
ミトラスフィアでは、jsの誤差があるということになります。
ちなみに厳密にはIEEE 754という規格の誤差で、高速演算を行うために生じている犠牲のようなものです。
正確に計算することもできますが、演算能力が低下し、手間もかかり、そこまでして計算結果が1ズレなくなるだけなので、ゲーム開発では無視されがち。
話すと長いのでわかりやすいページを紹介。
小数計算の誤差 0.1 + 0.2 が 0.30000000000000004 になる理由
↑気になる人はどうぞ。※リンクになっています。
なぜステータス計算機の誤差を無くせないのか
上記の計算式を例に挙げると簡単です。
最大HP×(0.21-0.01×SLv)
この式は、
最大HP×(0.20-0.01×(SLv-1))
と考える人もいるはず。
しかしこれでは実はSLv1では誤差は出ず、誤差の出るスキルレベルが変わってしまいます。
これは、式があっていても、計算の順番や形が違えば全て誤差の出方が変わるということです。
ステータス計算機の場合、
装備ひとつずつの数値計算→合計値→合計戦闘力
→キャップ戦闘力にあわせる→スキルを効果合計し、効果を計算
としていますが、違う手順でも求められますし、足し算の順番が違うだけでも誤差の出方が変わってしまいます。
(なんと0.01+0.01+0.2と0.2+0.01+0.01でも結果が違う!)
なんどもなんどもテストすれば完全に把握できますが、
これまた途方も無い作業(‘-‘;
暇な時に「実はこんな順じゃね?」みたいなのを試したりしながら、
たまたま完全一致を見つけれたらいいな…な次元です。
諦めていませんが遠そう・・・。