【问题标题】:Strange result of division in C [duplicate]C中除法的奇怪结果[重复]
【发布时间】:2010-11-02 09:42:53
【问题描述】:

一些重复:
1.265 * 10000 = 126499.99999999999 ?????
How is floating point stored? When does it matter?
Strange floating-point behaviour in a Java program
Why do I see a double variable initialized to some value like 21.4 as 21.399999618530273?
Error in Flash addition

我将 23 除以 40 (23/40)。在 C 中,此操作的结果为 0.5749999999999996。但实际上它必须是 0.575!

我该如何解决这个问题?

【问题讨论】:

  • 你见过this
  • 我们真的需要开始认真考虑禁止更多毫无意义的“浮点不准确”问题:-)
  • 在 SO.. 上有无数关于此的问题。
  • 如果您真的需要任意精度的算术,请查看gmplib.org
  • 我们需要更好的自动化来检测这些常规问题并将提问者引导至现有答案。不要问我怎么做,我不知道。

标签: c visual-studio math


【解决方案1】:

问题是因为 .575 值在浮点编码中没有精确的表示。修复取决于您对值的处理以及不准确性的影响。

如果只是显示问题,请使用四舍五入到小数点后 3 位,您将得到 0.575。

如果是因为计算不准确,请尝试将值保留为精确的分数。您必须存储和处理两个浮点值,但这将是准确的。当您需要结果时,将有效除法推迟到最后一刻。

检查这两个值之间的差异是否与您的问题相关。例如,将值减去 sqrt epsilon 并检查更改对最终计算结果的影响程度,并将其与所需或期望的精度进行比较。

不幸的是,我们不得不忍受浮点数中实值表示的限制。使用 128 位精度浮点数会使误差更小,但不会为空。

【讨论】:

    【解决方案2】:

    看看这个 - 它应该告诉你关于Why Computers Suck At Math的所有信息

    【讨论】:

    • 本来想用同一篇文章来回答的,结果你抢先了!必读!
    【解决方案3】:

    这是浮点数存储方式的产物。

    您可以四舍五入答案 sprintf("%.3f", result) 或使用一些小数处理包。

    【讨论】:

      【解决方案4】:

      我建议您在网络上搜索“浮点精度”或查看与您的 SO 重复的几十个其他问题。

      【讨论】:

      • 不幸的是,这些不是新手会搜索的术语(即使他们很麻烦)。
      【解决方案5】:

      floating point 算术正常。您可以更改 float 和 double 的打印方式,例如使用 %.3g

      【讨论】:

        【解决方案6】:

        你无法解决这个问题。并非所有数字都可以表示为浮点数,请参阅"how is floating point stored, when does it matter"。

        【讨论】:

        • 嘿!就在前几天,我在问是否有人能记得这个话题最早的化身。
        猜你喜欢
        • 2012-12-24
        • 1970-01-01
        • 2012-03-05
        • 2011-08-04
        • 2020-10-22
        • 2015-04-14
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        相关资源
        最近更新 更多