トップページ > 過去ログ > 記事閲覧
FPUの精度について
名前:powder 日時: 2009/09/17 02:13

浮動少数の精度が変わってしまう現象についてです。 DxLibInit後にintをdoubleに代入しただけで環境によって値が 変わってしまいリプレイずれの原因となっております。 例えば640をdouble型に代入で640.000010になる環境と640.000000に なる環境が存在します。 SetUse3DFlag(FALSE)の場合は精度が保たれるみたいです。 調べてみたところDirectXの初期化時にD3DCREATE_FPU_PRESERVEという フラグをセットすることで回避できるようです。 Dxライブラリで該当の初期化を行うことができますでしょうか。

Page: 1 |

Re: FPUの精度について ( No.1 )
名前:管理人 日時:2009/09/17 09:52

はい、できます DxLib_Init を呼び出す前に SetUseFPUPreserveFlag( TRUE ) ; という記述を追加すると Direct3D の初期化時に D3DCREATE_FPU_PRESERVE を使用するようになりますので よろしければお試しになってみてください m(_ _)m
Re: FPUの精度について ( No.2 )
名前:らり 日時:2009/09/17 16:17

先日同じ問題で完全にはまってしまったので少し。 DirectXの仕様とはいえ、 Dxライブラリ使用者はDirectXどころか C言語自体も覚えたて、という方が多いと思います。 そういった方々(私もだったわけですが^^;)にとっては、 double型で保証されているはずの精度が維持できないというのは、 理解に苦しむ現象ではないかな〜と思います。 あまり使用頻度の高い関数とはいえないかもしれませんが、 リファレンスなりミニテクニックなりの端にでも、 載せた方が良い関数じゃないかな?と思ったので、 ご報告させていただきます。 ***powderさんの返信を見て追記*** 私の場合は、扱うデータ自体を桁数の関係からdouble型で保存していました。 Dxライブラリの関数への引数や戻り値として・・・ならともかく、 なぜデータが破損する(ように見える)のか理解できず、 3日ばかりデータを扱うクラスや関数と睨めっこすることになってしまいましたw
Re: FPUの精度について ( No.3 )
名前:powder 日時:2009/09/17 13:02

管理人さんありがとうございます!試してみます。 確かにこれは知ってる人には当たり前かもしれませんが、知らないと調査ではまる事が多いですね。もっともリプレイずれ以外で困る場面は無いのかもしれませんが。
Re: FPUの精度について ( No.4 )
名前:管理人 日時:2009/09/20 08:44

そうですね、マイナー関数への関数の追加やミニテクページへの掲載を考えてみます

Page: 1 |