デバイスを初期化してすべてのイベントを処理するために、DXUT
を使用するD3Dアプリケーションを作成しています。しかし、私は奇妙な動作を見つけました。アプリケーションを作成すると、アプリケーションの倍精度計算がすべて壊れてしまいます。いくつかのデバッグ後、私はこれにコードを簡素化:D3Dデバイスの作成後に二重計算を行うことができません
bool CALLBACK AlwaysTrue(D3DCAPS9*, D3DFORMAT, D3DFORMAT, bool, void*) {
return true;
}
INT WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, INT) {
// Commenting line below solves the problem.
DXUTSetCallbackD3D9DeviceAcceptable(AlwaysTrue);
DXUTInit(true, true);
DXUTCreateWindow(L"Issue with doubles");
__int64 val = 1326778320508821LL;
double a1 = 0.000001 * val; // 1326778320.5088210
DXUTCreateDevice(true, 640, 480);
double a2 = 0.000001 * val; // 1326778368.0000000
DXUTMainLoop();
return DXUTGetExitCode();
}
まあ、私はかなり確信している、ここではフロート/ダブルの問題を持っているが、私はそれがトリガー取得方法を理解するために失敗し、どのようにそれを回避するには。私はasmレベルでデバッグしようとしましたが、そのコードはa1
とa2
で100%同じで、FPUの状態の問題だと思っています。
メインメソッドの最初の行をコメントアウトすると問題が解決します。
ここで何が起こっているのか誰かが知っていますか、この問題について詳しく知るにはいくつかの文書がありますか?私のアプリケーションは間違いなく倍精度の計算が必要です。
PS。 VS2008 SP1、SSE/SSE2がオフ、浮動小数点モデル:正確。
ありがとうございます!これは役に立ちます。 Docsは、このアプローチがパフォーマンスを悪化させていると言いますが、今は計算の精度にもっと関心があります。 – real4x
パフォーマンスのコメントはかなり前に書かれたことに注意してください(私は約8年かそこらと仮定しています)。現在のCPUでは、パフォーマンスの問題は、倍数の場合に処理するデータ量が多いためにキャッシュ圧が増えるだけです。コードを変更せずにFPUの精度を変更しても、アルゴリズムの動作に影響を与えない限り、パフォーマンスに影響はありません。 – zeuxcg