【问题标题】:floating point precision浮点精度
【发布时间】:2009-07-29 15:20:05
【问题描述】:

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

有什么想法可以实现吗?

【问题讨论】:

    标签: c# c++ math floating-point double


    【解决方案1】:

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

    更多信息请访问Direct3D and the FPU

    【讨论】:

    • 我建议将其更改为“有福”的答案。
    【解决方案2】:

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

    【讨论】:

    • 我认为二进制搜索可能会在某些部分使用,但这只会影响搜索键中使用浮点数或双精度数的情况。
    • 我想你误会了,安德烈亚斯。他建议您注释掉现有代码和调用的部分内容,直到您找到一个让您的精确度受到影响的调用。开始的一种好方法是只注释掉一半的代码。如果它仍然失败,它在未注释的调用中。继续缩小范围,直到你只剩下一个电话。
    • 在你的程序中跟踪一个值,看看它在哪里失去了精度。二分搜索意味着从数据流的大致中间点开始,然后从那里缩小范围。
    • 给你一个-1,因为这种情况很明显,不需要“二分查找”。 Greg Hewgill 有正确的答案,恕我直言。
    • @akauppi:这很明显,但并未提及已采取的方法。
    【解决方案3】:

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

    【讨论】:

    • 我在我的程序中使用 DirectX。你能告诉我哪个 DX 函数会降低精度吗?或任何文档链接?
    • 我自己没有使用过,所以这只是传闻——但我相信它在 DirectX 的初始化代码中。不知道换回去会出什么问题...
    • 是的,你完全正确。初始化 DX 设备时必须指定 D3DCREATE_FPU_PRESERVE。
    猜你喜欢
    • 2023-03-31
    • 2018-07-06
    • 2017-11-30
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多