トップページ > 記事閲覧
DxLib_Init()実行後、Math.sqrtの結果が変わる
名前:ack 日時: 2021/11/10 18:26

DXライブラリ for VisualC#(Ver.3.22e)を.NET Ver.4(VisualStudio2010 C#)で利用させていただいています。 DxLib_Init()を実行すると、平方根を求めるsqrt関数"double System.Math.Sqrt(double)"の答えが変わってしまいます。 string AnsA = System.Math.Sqrt(2.0d).ToString() + "\n"; DxLib_Init(); string AnsB = System.Math.Sqrt(2.0d).ToString() + "\n"; System.IO.File.WriteAllText("c:\debug.txt", AnsA+AnsB); 上記を実行すると AnsA = 1.4142135623731 AnsB = 1.41421353816986 となり、AnsBはfloatで計算した結果をDouble型に変換した値になっています。 DxLib_Init()によって、System.Math.Sqrtがラッピングされているのでしょうか? 回避策として、『Sqrtの代わりにSystem.Math.Pow(2.0d,0.5d)を使う』方法を見つけましたが、理由が知りたいのと、 他の関数にも影響が無いでしょうか? また、根本的な回避策は無いでしょうか?
メンテ

Page: 1 |

Re: DxLib_Init()実行後、Math.sqrtの結果が変わる ( No.1 )
名前:管理人 日時:2021/11/11 22:37

> DxLib_Init()によって、System.Math.Sqrtがラッピングされているのでしょうか? DXライブラリは System.Math.Sqrt をラッピングしたりはしていませんが、 Direct3D 9 の仕様として計算速度を稼ぐために CPU の浮動小数点演算の精度をデフォルトでは float に変更する、というものがあります こちらは CPU 自体の設定を変更してしまうものなので、Direct3D 9 内の浮動小数点計算だけではなく、 アプリ内の Direct3D 9 以外での浮動小数点計算にも影響してしまいます こちらを計算速度を犠牲にしてでも精度を double で計算する、というオプションがありまして、 DXライブラリでは DxLib_Init の呼び出しの前に SetUseFPUPreserveFlag( TRUE ); と記述することでONにすることができます まだ Direct3D 9 の仕様によるものが原因と断定できるわけではありませんが、 よろしければ SetUseFPUPreserveFlag( TRUE ); を試してみてください m(_ _)m
メンテ
Re: DxLib_Init()実行後、Math.sqrtの結果が変わる ( No.2 )
名前:ack(解決) 日時:2021/11/12 15:53

SetUseFPUPreserveFlag(TRUE); で解決できました。 DXライブラリを使用した自作ソフトと使用しない他者のソフトで計算結果を一致させる必要があり、 悩んでおりました。 “SetUseFPUPreserveFlag”をキーワードに検索すると、過去に同じような記事が何度かあったようで、 見つけ切れずにお手数をおかけしました。 お忙しい所、回答ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存