整数浮点数比较如何工作?

时间:2014-07-07 12:14:27

标签: ruby ruby-1.9

以下表达式在Ruby 1.9上评估为true:

31964252037939931209 == 31964252037939933000.0
# => true 

但我不知道这是怎么回事。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:3)

解释很简单,用于在计算机上表示浮点(即十进制)数字的标准方法本质上是不准确的,并且只提供近似表示。这不是Ruby特有的;您在问题中显示的类型错误几乎出现在每种语言和每个平台上,您只需要知道它们可能会发生。

尝试将示例中的大整数值转换为浮点值可以更好地说明问题 - 您可以看到解释器无法提供精确的表示形式:

irb(main):008:0> 31964252037939931209.to_f
=> 31964252037939933000.0

维基百科的article on floating pointa more thorough discussion of accuracy problems以及其他示例。

答案 1 :(得分:1)

Ruby用于在这种比较中将bignums转换为浮点数,并且转换精度丢失了。 The issue is solved in more recent versions

答案 2 :(得分:0)

在这里,您可以看到Ruby的比较器的源代码:

http://www.ruby-doc.org/core-1.9.3/Comparable.html#method-i-3D-3D

似乎正在使用这个实际的比较器:

https://github.com/p12tic/libsimdpp/blob/master/simdpp/core/cmp_eq.h

使用这个方法似乎正在比较:

/** Compares 8-bit values for equality.

@code
r0 = (a0 == b0) ? 0xff : 0x0
...
rN = (aN == bN) ? 0xff : 0x0
@endcode

@par 256-bit version:
@icost{SSE2-AVX, NEON, ALTIVEC, 2}
*/

我的猜测可能是两个数字的值都相同。