我有一个用 C# 编写的程序,有些部分是用本机 C/C++ 编写的。我使用双精度来计算一些值,有时由于精度太小,结果是错误的。经过一番调查,我发现有人将浮点精度设置为 24 位。当我将精度重置为至少 53 位(使用 _fpreset 或 _controlfp)时,我的代码工作正常,但我仍然需要首先弄清楚谁负责将精度设置为 24 位。
有什么想法我可以做到这一点吗?
我有一个用 C# 编写的程序,有些部分是用本机 C/C++ 编写的。我使用双精度来计算一些值,有时由于精度太小,结果是错误的。经过一番调查,我发现有人将浮点精度设置为 24 位。当我将精度重置为至少 53 位(使用 _fpreset 或 _controlfp)时,我的代码工作正常,但我仍然需要首先弄清楚谁负责将精度设置为 24 位。
有什么想法我可以做到这一点吗?
这是由默认的 Direct3D 设备初始化引起的。您可以通过将D3DCREATE_FPU_PRESERVE
标志传递给CreateDevice
. CreateFlags.FpuPreserve
如果需要,还有一个与此标志 ( ) 等效的托管代码。
更多信息可以在Direct3D 和 FPU中找到。
在程序中按分区进行二分搜索并确定哪些调用会降低精度呢?
您的代码使用的是 DirectX 还是 XNA?我当然听说过因此存在问题 - 一些 DirectX 初始化代码(可能仅在托管包装器中?)降低了精度。