Naukę Rubiego zacząłem już jakiś czas temu. Robiąc jedno z zadań z Project Euler trafiłem na dziwne zachowanie interpretera Ruby. Mianowicie przy wielu liczbach całkowitych ich pierwiastek jest niepoprawny. Z tego co zauważyłem problem występuje dla liczb większych od 106. Może to ja robię coś źle?
Na najprostszym przykładzie:
num = 123456789 sqrt = Math.sqrt(num) #=> 11111.1110605556 (sqrt**2).prec_i #=> 123456788
I tak dalej:
(Math.sqrt(1234567890)**2).prec_i #=> 1234567889 (Math.sqrt(1000200001)**2).prec_i #=> 1000200000 (Math.sqrt(10020001)**2).prec_i #=> 10020000 (Math.sqrt(1824304153657982900)**2).prec_i #=> 1824304153657982720
Ale znowu:
(Math.sqrt(100000000)**2).prec_i #=> 100000000 (Math.sqrt(1002001)**2).prec_i #=> 1002001
Może mi to wyjaśnić jakiś "rubinowiec"? ;)
math
Autorem bloga jest Mariusz "marines" Kujawski. Poświęcony jest on programowaniu w językach webowych (PHP), tworzeniu stron (XHTML/CSS), systemom operacyjnym oraz przeróżnym nowinkom z sieci. 

Nie używam Ruby, ale czy na pewno prec_i robi to, co myślisz, że robi? Czy nie powinnieneś raczej używać jakiejś formy round?
No i może jeszcze poczytaj http://en.wikipedia.org/wiki/IEEE_754-2008 :)
wiem do czego służy prec_i i jakie są tego konsekwencje, ale chciałem bardziej zobrazować. chociaż może bardziej pasować będzie ten przykład (bez prec_i):
irb(main):037:0> Math.sqrt(182430415365798_4391)**2
=> 1.82430415365798e+18
irb(main):038:0> Math.sqrt(182430415365798_1391)**2
=> 1.82430415365798e+18
irb(main):039:0> Math.sqrt(182430415365798_2938)**2
=> 1.82430415365798e+18
a to oznacza, że mogę się pożegnać z operowaniem na takich liczbach. dzięki i0.
Ruby is logic :>
A nie jest to ograniczenie dokładności liczb zmiennoprzecinkowych?
Bo to jest floating point, a nie przetwarzanie symboliczne – przy floating point niemal zawsze tracona jest dokładność.
ok, dzięki za wyjaśnienia
Swoją drogą – Ruby zapewne posiada możliwość wykonywania obliczeń wysokiej precyzji na dużych liczbach, prawda? Coś jak powolne BIGNUM dla C/C++ ;]
AFAIR potrafi obsłużyć każdą liczbę mieszczącą się w pamięci komputera.
Po prostu musisz użyć przy tak dużej liczbie trzeba skorzystać z np:
GMP -
GNU Multiple Precision Arithmetic Library (lub GMP)[23] - to biblioteka programistycz-
na udostępniająca liczby całkowite ze znakiem, wymierne i zmiennoprzecinkowe o dowolnej
precyzji. Jedyny limit stanowi dostępność wolnej pamięci operacyjnej. Podstawowym inter-
fejsem dla biblioteki jest język C, ale są dostępne interfejsy także w innych językach, np.
C++, Ocaml, Perl i Python.
Dzięki za udostępnienie. Dobre rzeczy bardzo ciekawe. Będę w domu na ponowną wizytę.