Следующее выражение оценивается истина на Ruby 1.9:Как работает сравнение integer-float?
31964252037939931209 == 31964252037939933000.0
# => true
, но я понятия не имею, как это происходит. Я что-то упустил?
Следующее выражение оценивается истина на Ruby 1.9:Как работает сравнение integer-float?
31964252037939931209 == 31964252037939933000.0
# => true
, но я понятия не имею, как это происходит. Я что-то упустил?
Ruby используется для преобразования бонусов в поплавки в таких сравнениях, и точность преобразования была потеряна. The issue is solved in more recent versions.
Ruby 2.0 не дает вам больше точности с плавающей запятой, преобразование выполняется по-другому: '31964252037939933184 == 31964252037939933000.0 # => true' – Stefan
Здесь вы можете увидеть исходный код компаратора для 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}
*/
Мое предположение может заключаться в том, что значение одинаково для обоих чисел.
Объяснение просто состоит в том, что стандартные методы представления чисел с плавающей запятой (то есть десятичные) на компьютерах по своей сути являются неточными и только когда-либо предоставляют приблизительное представление. Это не относится к Ruby; ошибки типа, который вы показываете в своем вопросе, возникают практически на каждом языке и на каждой платформе, и вам просто нужно знать, что они могут произойти.
Попытки преобразовать большое целое значение в вашем примере с плавающей точкой иллюстрирует проблему немного лучше — вы можете увидеть интерпретатор не в состоянии обеспечить точное представление:
irb(main):008:0> 31964252037939931209.to_f
=> 31964252037939933000.0
Википедия article on floating point имеет a more thorough discussion of accuracy problems с другие примеры.
он оценивает ложь в моей системе .. – dax
Не для меня в 1.9.3 – shiva
'31964252037939931209.to_f # => 31964252037939933000.0' (Ruby 1.9.3) – Stefan