小编rea*_*l4x的帖子

D3D设备创建后无法进行双重计算

我正在编写一个 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% 相同a1a2这让我认为这是 FPU 状态问题。

由于某种原因,注释掉主方法中的第一行可以解决问题。

有谁知道这里发生了什么,并且可能有一些文档可以了解有关此问题的更多信息?我的应用程序肯定需要双精度计算。

附言。VS2008 SP1,SSE/SSE2关闭,浮点模型:精确。

c++ direct3d

3
推荐指数
1
解决办法
392
查看次数

标签 统计

c++ ×1

direct3d ×1