2014-07-07 9 views
0

Следующее выражение оценивается истина на Ruby 1.9:Как работает сравнение integer-float?

31964252037939931209 == 31964252037939933000.0 
# => true 

, но я понятия не имею, как это происходит. Я что-то упустил?

+0

он оценивает ложь в моей системе .. – dax

+0

Не для меня в 1.9.3 – shiva

+2

'31964252037939931209.to_f # => 31964252037939933000.0' (Ruby 1.9.3) – Stefan

ответ

1

Ruby используется для преобразования бонусов в поплавки в таких сравнениях, и точность преобразования была потеряна. The issue is solved in more recent versions.

+1

Ruby 2.0 не дает вам больше точности с плавающей запятой, преобразование выполняется по-другому: '31964252037939933184 == 31964252037939933000.0 # => true' – Stefan

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

methood, кажется, сравнивая используя это:

/** 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} 
*/ 

Мое предположение может заключаться в том, что значение одинаково для обоих чисел.

3

Объяснение просто состоит в том, что стандартные методы представления чисел с плавающей запятой (то есть десятичные) на компьютерах по своей сути являются неточными и только когда-либо предоставляют приблизительное представление. Это не относится к Ruby; ошибки типа, который вы показываете в своем вопросе, возникают практически на каждом языке и на каждой платформе, и вам просто нужно знать, что они могут произойти.

Попытки преобразовать большое целое значение в вашем примере с плавающей точкой иллюстрирует проблему немного лучше — вы можете увидеть интерпретатор не в состоянии обеспечить точное представление:

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

Википедия article on floating point имеет a more thorough discussion of accuracy problems с другие примеры.

Смежные вопросы