ステータス計算機の誤差について

ずっと誤差をなんとかしたいと思っていたけど、難しそうです。

今日手伝ってもらってデスカロシューターで実験した結果からの推測ですが・・・。

計算の話なので興味ない人はスルーで(‘-‘;

ミトラスフィアの攻略には全くもって使えない知識です。たぶん。

まず今日起きたおかしな出来事から説明します。

デスカロシューターで見つけた異変?

デスカロシューターの反動ダメージを計算するために今日実験したのですが、

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.20.2+0.01+0.01でも結果が違う!)

なんどもなんどもテストすれば完全に把握できますが、
これまた途方も無い作業(‘-‘;

暇な時に「実はこんな順じゃね?」みたいなのを試したりしながら、
たまたま完全一致を見つけれたらいいな…な次元です。

諦めていませんが遠そう・・・。

コメントを残す

メールアドレスが公開されることはありません。