浮点精度

我有一个用C#编写的程序,有些部分是用本机C / C ++编写的。 我使用双精度计算某些值,有时结果是错误的,因为精度太小。 经过一番调查后,我发现有人将浮点精度设置为24位。 当我将精度重置为至少53位(使用_fpreset或_controlfp)时,我的代码工作正常,但我仍然需要弄清楚谁负责将精度设置为24位。

我能做到这一点的任何想法?

这是由默认的Direct3D设备初始化引起的。 通过将D3DCREATE_FPU_PRESERVE标志传递给CreateDevice可以告诉Direct3D不要弄乱FPU精度。 如果需要,还有一个与此标志等效的托管代码( CreateFlags.FpuPreserve )。

可以在Direct3D和FPU上找到更多信息。

如何通过分区对程序进行二进制搜索并确定哪些调用会降低精度?

您的代码是否完全使用DirectX或XNA? 我当然听说有问题 – 一些DirectX初始化代码(可能只在托管包装器中?)会降低精度。