【问题标题】:Different behaviour while comparing double [duplicate]比较双倍时的不同行为[重复]
【发布时间】:2016-04-05 13:43:03
【问题描述】:

您好,我知道计算机受数字精度的限制,有些数字不能用二进制精确表示。这就是为什么我要问 为什么这样比较

(0.1*3) == 0.3

在 Java 语言中计算为 false,而在 C 中计算为 true,对我来说,Java 行为更直观一点。提供的任何答案都不能回答我的问题,为什么它们具有不同的行为,因为两者都使用 IEEE 754 标准。

@更新 我正在使用 ideone 来测试条件。

【问题讨论】:

  • @Lundin 的问题是相反的:为什么这两个数字被认为相等?
  • @Lundin:我不认为他们使用不同的浮点标准。仅仅是因为他们很可能使用仅实现一种标准(通常是 IEEE754)的硬件 FPU。但他们可能会使用不同的舍入模式和 IEEE754 中允许的其他变化。
  • floating-point-gui.de/errors/comparison 请记住浮点数是二进制而不是十进制,不要指望它像十进制一样工作,因为 0.1 和 0.3 都不能用二进制表示。 Is floating point math broken?
  • 是否可以保证不同的语言必须表现相同?也有区别,例如用于语言之间的整数溢出。有些甚至改变了不同版本之间的操作行为(例如 C 中的有符号整数除法)。
  • C doesn't guarantee IEEE-754 尽管所有现代架构都使用 IEEE-754。甚至C codes running in the same machine might produce different results,因为一个可能在 x87 中运行,另一个在 SIMD 中运行,您的情况也可能如此。

标签: java c


【解决方案1】:

比较浮点值是出了名的不精确。

对于任何给定的浮点运算,您只能保证精确到 DBL_EPSILON / Double.Epsilon。超出此精度的任何位都是算术运算的产物,应被忽略。

不同的程序,当然还有不同的语言,会以不同的方式(显然)实现这种比较。如果您可以设法将值与特定精度进行比较,即值的表示范围内的特定位数(例如,IEEE 双精度浮点数为 52 位或更少),您将更有可能获得相同的结果.

参考 (2016 年 4 月添加)

以下是浮点数及其行为方式经常被引用的解释:
What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2020-03-24
    • 1970-01-01
    • 2014-03-02
    • 2012-10-31
    • 2013-03-12
    • 2012-10-09
    • 2019-07-01
    • 2014-02-16
    相关资源
    最近更新 更多