【问题标题】:Does ruby calculate floats wrong? [duplicate]红宝石计算浮动错误吗? [复制]
【发布时间】:2011-08-17 11:42:04
【问题描述】:

这里有什么问题? (红宝石版本:1.9.2p290(2011-07-09 修订版 32553)[x86_64-darwin11.0.0]

x = 523.8
w = 46.9
xm = x + w
assert_equal w, (xm - x) # FAILS with: <46.9> expected but was <46.89999999999998>

【问题讨论】:

  • @Vache:不幸的是,这个网站是为程序员而不是计算机科学家准备的,而且 Goldberg 的论文比人们预期的更复杂和详细,无法作为一个简单问题的答案。
  • 这就是为什么我将其发布为评论而不是答案的原因。 :)
  • “程序员,而不是计算机科学家”——他们应该是同义词,足以理解那篇文章和浮点数。
  • 我认为是,因为它解释了人们应该了解的浮点知识。这可以避免很多额外的问题。有些事情不是几句话就能解释的。

标签: ruby floating-point floating-accuracy


【解决方案1】:

来自The Floating-Point Guide

为什么我的数字,比如 0.1 + 0.2 加起来不是很好的 0.3,而且 相反,我得到了一个奇怪的结果,比如 0.30000000000000004?

因为在内部,计算机使用一种格式(二进制浮点) 根本无法准确表示像 0.1、0.2 或 0.3 这样的数字。

当代码被编译或解释时,你的“0.1”已经 以该格式四舍五入到最接近的数字,这会导致小 甚至在计算发生之前就有舍入误差。

阅读链接到的网站了解详细信息和解决此问题的方法。

【讨论】:

  • -1 获得重复问题的代表。
【解决方案2】:

这是完全正常的;这是关于浮点运算而不是 Ruby 的低级概念的事实,因此可以出现在任何语言中。

浮点运算不精确。应该用接近assert((xm-x).abs &lt; epsilon) 的方式来代替平等,其中epsilon 是一些小的数字,例如0.01

【讨论】:

    【解决方案3】:

    阅读this。它描述了浮点数的二进制表示在每种语言中的工作方式,而不仅仅是 Ruby。

    【讨论】:

    • (叹息)有必要吗?
    • 是你带来了“声誉”——声誉本身并不意味着什么。你的回复太自以为是了。其他人则没有这种态度并提供更好的答案 - 请参阅您的回复上方的那个。与您不同,我发现这个问题非常适合并且值得回答。如果你有一个没有态度的回答问题,也许根本不回答?我不是那种用“叹息”来攻击新人的人。为什么你是这样的戏剧女王?如果有人在拖钓,那就是你——从技术角度来看,没有必要“叹气”。
    【解决方案4】:

    您的问题的答案是:

    (其他答案告诉你原因,但你没有问那个。:p)

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多