C# 浮点精度

C# 浮点精度,c#,c++,math,floating-point,double,C#,C++,Math,Floating Point,Double,我有一个用C#编写的程序,有些部分是用原生C/C++编写的。 我使用double来计算一些值,有时由于精度太小,结果是错误的。经过调查,我发现有人将浮点精度设置为24位。当我将精度重置为至少53位(使用_fpreset或_controlfp)时,我的代码工作正常,但我仍然需要首先确定谁负责将精度设置为24位 你知道谁能做到这一点吗?你的代码使用的是DirectX还是XNA?我当然听说这会导致一些问题-一些DirectX初始化代码(可能仅在托管包装中?)会降低精度。通过程序分区进行二进制搜索并确定

我有一个用C#编写的程序,有些部分是用原生C/C++编写的。 我使用double来计算一些值,有时由于精度太小,结果是错误的。经过调查,我发现有人将浮点精度设置为24位。当我将精度重置为至少53位(使用_fpreset或_controlfp)时,我的代码工作正常,但我仍然需要首先确定谁负责将精度设置为24位


你知道谁能做到这一点吗?

你的代码使用的是DirectX还是XNA?我当然听说这会导致一些问题-一些DirectX初始化代码(可能仅在托管包装中?)会降低精度。

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

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


有关更多信息,请访问。

我正在程序中使用DirectX。你能告诉我哪个DX函数会降低精度吗?或者任何文档链接?我自己没有使用过,所以这只是道听途说-但我相信它在DirectX的初始化代码中。如果你把它换回来会出什么问题,我不知道……是的,你绝对正确。初始化DX设备时,您必须指定D3DCREATE_FPU_PRESERVE。我认为在某些部分可能会使用二进制搜索,但这只会影响搜索键中使用浮点或双精度时。我认为您误解了,Andreas。他建议你注释掉一些现有的代码和调用,直到你找到一个能让你精确的调用为止。一个好的开始方法是注释掉一半的代码。如果仍然失败,则在未注释的调用中。通过这种方式不断缩小范围,直到只进行一次调用。在程序中跟踪一个值,看看它在哪里失去精度。二进制搜索意味着从数据流中间的一个点开始,并从那里缩小。给你一个-1,因为这种情况是显而易见的,不需要“二进制搜索”。格雷格·休吉尔(Greg Hewgill)给出了正确的答案,伊姆霍。@akauppi:这是显而易见的,但并没有提到这是一种已经采取的方法。我建议将其改为“受祝福的”答案。