我正在编写一个 D3D 应用程序,用于DXUT
初始化设备并处理所有事件。不过,我发现了一个奇怪的行为:一旦我创建了一个设备,应用程序中的所有双精度计算都会被破坏。经过一些调试后,我将代码简化为:
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();
}
Run Code Online (Sandbox Code Playgroud)
好吧,我很确定这里有 float/double 问题,但我无法理解它是如何触发的以及如何解决它。我尝试在 asm 级别进行调试,发现代码 100% 相同a1
,a2
这让我认为这是 FPU 状态问题。
由于某种原因,注释掉主方法中的第一行可以解决问题。
有谁知道这里发生了什么,并且可能有一些文档可以了解有关此问题的更多信息?我的应用程序肯定需要双精度计算。
附言。VS2008 SP1,SSE/SSE2关闭,浮点模型:精确。