パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

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

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

    • Re: (スコア:5, 参考になる)

      by Anonymous Coward

      リンク先でたどれる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は倍精度から単精度

      • by Anonymous Coward

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

        • by Anonymous Coward

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

          • by Anonymous Coward

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

            • by Anonymous Coward

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

              • by Anonymous Coward on 2018年06月12日 20時55分 (#3423997)

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

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

                親コメント
              • by Anonymous Coward

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

              • by Anonymous Coward

                想定っていうか検証だな。
                記事見ると

                pos.y -= sins(angle) * 0.58;
                angle += 0x100;

                って処理がループするらしいけどangleが一巡した時にpos.yが同一の値になることを検証しておくだけでいい。

                スーパーゲームボーイは画面や入力はエミュだけどCPUはスーパーゲームボーイ内にゲームボーイ互換CPUが入ってたわけで、CPUの互換性が確保されていればCPUの動作に関しての問題は発生しなかった。

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

処理中...