【发布时间】: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 中运行,您的情况也可能如此。