パスワードを忘れた? アカウント作成
13619320 story
バグ

エミュレータ移植のWii版マリオ64、浮動小数点演算の関係でオリジナル版とは挙動が異なることが判明 58

ストーリー by hylom
浮動小数点の罠 部門より

エミュレータを使って移植されているWii版のスーパーマリオ64では、特定の場所の「揺れる足場」の挙動がオリジナルのNINTENDO64版とは僅かに異なるという。その原因は、64ビット浮動小数点演算結果を32ビット浮動小数点に変換する際の処理が異なる点にあるそうだ(なぜWii版マリオ64で長時間放置すると足場が浮かび上がるのか(非技術者向け解説))。

ことの発端は、ゲーム内でジャンプ操作を行うための「Aボタン」を押さないでステージをクリアするという縛りプレイを行っているプレイヤー達による研究で、「ほのおの うみの クッパ」というステージではWii版に限り長時間待つと「揺れる足場」が浮き上がっていくことが分かったという(AUTOMATON)。

これは、足場の揺れ具合を計算する処理において64ビット浮動小数点数を32ビット浮動小数点数に変換する際に僅かに丸め誤差が発生し、それが累積することによるものだという。縛りプレイヤーたちはこれを利用して足場を十分な高さまで浮上させることで、Aボタンを押さずにステージクリアを達成することにチャレンジしているようだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 世の中想像もつかない事をしてる集団が存在するんだな~

    • by Anonymous Coward

      【ロマサガ3】セレクトボタン禁止RTA(Real Time Attack) [nicovideo.jp][不快と思う方が多い表現が多々あるので閲覧注意]に比べればまだ人間が想像しやすい縛りだと思います。

      • by Anonymous Coward

        現在進行中のサガフロ2最小ターンTASではその手の表現がほとんど影を潜めているところを見るとやっぱり不快に思う人が多かったんでしょうね。

        • by Anonymous Coward

          元々が相手を不快にさせておちょくる文化の産物だから、不快に思う人は多くて当然なんだけどな…
          にもかかわらず流行りだとか荒れればコメントが稼げるとかで使うバカは大勢いるってのが嘆かわしい。
          元々が荒らしの性質を持ってるから、止めても同類の名の下に持ち込まれて足を洗うのも難しいとかホントやな文化。

  • by Anonymous Coward on 2018年06月11日 21時37分 (#3423400)

    PSシリーズのナムコミュージアムもだいたいダメ。
    結局MAMEが一番オリジナルに一番近い。

    • by Anonymous Coward

      エミュレーションの甘さってのはどんな環境でも起こりうることだと思うけどね。

      • by Anonymous Coward

        趣味人が完全再現を頑張るMAMEと、商売で再現度と売り上げ、開発費のバランスを考えるメーカの違いじゃないかな?

    • by Anonymous Coward

      BGとOBJの表示タイミングの違いも考慮されないMAMEがオリジナルに近いってww

  • by Anonymous Coward on 2018年06月11日 18時55分 (#3423313)

    WiiのVCがどういう実装になっているか知らんけど
    CPUからまるまるエミュレーションしていなくて、
    ライブラリ(BIOS?API)の実装違いの様な気がする
    切り捨てか四捨五入かというより、
    0捨て1入とか最下位ビットの扱いの差異じゃないかな

  • by Anonymous Coward on 2018年06月11日 19時31分 (#3423345)

    浮動小数点演算の規格IEEE754では複数の丸めモードが定義されているが、同じ丸めモードだったら処理結果は完全に一致するのではないのか?
    それともIEEE754とは無関係に独自実装したのか?

    • by Anonymous Coward on 2018年06月11日 20時29分 (#3423377)

      リンク先でたどれるGoogleドキュメントの [google.com]「Wii VC Rounding / BitFS Platform Drift」という項目によると、

      This is caused by the Wii VC incorrectly converting the MIPS cvt.s.d instruction to the PowerPC stfs instruction. With the latter, double to single precision floating point conversion is undefined. The Wii uses round-to-zero for this conversion, while SM64 uses round-to-nearest.
      【適当な訳】
      このバグは、WiiVCが内部的にMIPS(64のCPU)の命令「cvt.s.d」をPowerPC(WiiのCPU)の命令「stfs」に変換することによって発生します。stfsは倍精度から単精度への変換方法は未定義です。結果、Wiiでは(SM64で行われる)最近接丸めではなく、切り捨てが行われます。

      とのことで、CPUへの命令の変換の仕方に問題があるとのことです。

      # SM64の意味が解らず、Google先生に聞いたらSuper Mario 64だと教えてもらった

      親コメント
      • by Anonymous Coward

        PowerPCのstfsを使わずに最近接丸めをソフト処理すりゃ直る程度の話かな。

        • by Anonymous Coward

          それよりは、計算誤差でどんどんズレるソフトの設計がマズいんじゃないかと。

          • by Anonymous Coward

            基本短時間のアクションゲームだからOKとするのはあり得るけど、この件はどうなんでしょうね。

            • by Anonymous Coward

              uint32のカウンターを1フレーム、1/60秒毎に++しておいて、キャラの動きやフェードイン、フェードアウトその他、あらゆる演出はそのカウンターの進み具合を基準に動かす、という実装が便利で楽。

              ただこれ、だいたい2年ちょっとでオーバーフローして0に戻るので、その瞬間に表示が乱れる。

              いくつかの場面でデバッガでオーバーフローの瞬間を再現してみて、大した事は起こらなさそう、ぐらいまでは試したけど、ゲーム中のあらゆる場面で大した問題が無いと試すのはテスト工数が多すぎて諦めた。

          • by Anonymous Coward

            設計は最近接丸めを想定していたのにエミュレーションの実装が不完全なのが悪い(まあ普通問題になることではないが)

            • by Anonymous Coward

              この丸めだから、どんなに計算を繰り返しても誤差は想定内に収まる、と証明するのは相当難しそうだと思うけど。

              問題になってる程度のプログラムなら、1周期分計算したら丁度同じ値になった、他の値は取りえない、これで大丈夫、ぐらいで証明できる可能性もあるけど。

              もし、そういう分かりやすい性質がなかったら、かなり大変。
              ちゃんと証明できるとしたら、ガチの数値計算の専門家ぐらい。

              (まともな大学の工学系だと、カリキュラムのどこかで、計算誤差の注意点については習うはず。
              浮動小数点数の計算順序を変えただけで誤差が大きく変わってくるとかそういう。
              プログラマなら誰

          • by Anonymous Coward

            元ゲームプログラマですが、そのとおりですね。
            元のマリオ64の作りが良くないです。
            現在位置に加減算して上下動させると誤差蓄積でずれや歪みが発生するので、
            本来は固定の基準点から相対的に上下動させるようにします。

            • by Anonymous Coward

              実機での誤差が累積して0になることを想定の上でコード書いてたら、
              移植を想定しないゲームのコードとしては問題ないんじゃないかな。

              • by Anonymous Coward

                > 移植を想定しない

                スーファミにもスーパーゲームボーイがあったくらいだから、移植やエミュの想定をしてないとは思えないな。
                OSのバージョンが変わると動かなくなるアプリのように、不用意な作りではあるだろうよ。
                メンテナ泣かせ。

              • by Anonymous Coward

                想定なんてできないってばよ。
                丸め方法の違いも、「誤差が蓄積するやつ」と「蓄積しないやつ」じゃなく、
                「誤差が蓄積するやつ」と「それよりは誤差が蓄積しづらいやつ」ぐらいの差しか無い。

                デバッガで入念にチェックすれば、運良く誤差が蓄積しない動作になってる事を確認できるかもしれないし、
                確認出来ればゲームの実装としてはそれで十分だと思うけど、
                確認に相当な手間が掛かるから、1クロックでも早く動くプログラムにしたい、とかの強い動機でもない限りはお勧めできない。

              • by Anonymous Coward

                一般論と個別論の区別がついとらんね
                「ある」プログラムについて誤差が蓄積しないことを確認するには「それ用」の検証プログラムで十分
                デバッガでやるやつはバカ
                ゲームプログラマにはクロック削りのような目先のことしかできないバカが多い印象があったがまた一つ裏付けられた

        • by Anonymous Coward

          CPUの命令はよくわかりませんが、
          stfsの前にfrspとかいう命令つかって丸める必要があったのかと

      • by Anonymous Coward

        エミュレータって、大抵は性能ぎりぎりの状態で開発がスタートするので、挙動が異なるのを承知で速い命令を採用することも少なくないと思います。
        現在のCPUでも丸めやデノーマルの処理方法の変更には大きなペナルティがあったりするので、仕方なく標準ライブラリと合わせていることもあるでしょう。

      • by Anonymous Coward

        縛りプレイなので9じゃなくて4の形になってます

  • by Anonymous Coward on 2018年06月11日 19時10分 (#3423325)

    りんごとみかんみたいな説明してるのかと思ったら、単に二進数から説明してるだけか。
    これ非技術者は理解できるの?

    • by Anonymous Coward

      そもそも浮動小数点演算の一般論を述べているだけでぜんぜん解説になっていない

      • by Anonymous Coward

        固定小数点の範囲で終わってるのに「浮動小数点の説明」と言ってるのは引っかかりましたが、
        ここでの肝は、「小数を正確に表現することは(ほとんどの場合で)できなくて,誤差が累積するような使い方をするとズレていっちゃうよ」ってのが判ればまあいいんじゃないかと思う。

    • by Anonymous Coward

      一流の数学者だって技術者ではないのだからいいんじゃない?

  • by Anonymous Coward on 2018年06月11日 22時05分 (#3423413)

    > そもそも移植なのにどうして食い違いが発生したのでしょう。実は64とWiiでは使っているCPUが違い、64は「MIPS」というCPUを使っており、Wiiは「PowerPC」というCPUを使っています。そして、Wiiに移植するときに、64bitから32bitに丸める命令を、挙動が違うものを選んでしまったようです。

    「64bitから32bitに丸める命令を、挙動が違うものを選んでしまったようです」て説明ではMIPSやPowerPCでは浮動小数点データのフォーマット変換の命令が丸めモード毎に別になってるような印象だが本当?
    知らんけどMIPSでもPowerPCでも丸めのやり方なんてFPUへのモード設定とかで決まるんじゃねぇの? 眉唾な記事だなあ。

    • by Anonymous Coward

      CPUの違いを理解しないで移植しちゃうとあり得る話ですよ。

  • by Anonymous Coward on 2018年06月12日 3時04分 (#3423525)

    デッドオアアライブの垂れ巨乳もほおっておけばいいの?

    • by Anonymous Coward

      十分に待つと髪が逆立ちます

    • by Anonymous Coward

      次からは堅いそうだから垂れないんじゃないかな
      しかしシリーズ当初からの売りを捨てるとは…

typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...