Поведение рубина в отношении числовой точности (схема сравнения) - PullRequest
3 голосов
/ 01 декабря 2011

В Ruby (1.9) числа всегда считаются точными?Я знаю, что Ruby делает довольно сложные вещи с числами под капотом, так как вы можете делать сумасшедшие вещи, такие как просить 1 триллион с мощностью 1 триллион, и вы получите ответ (после ожидания многих лун для его вычисления).

В схеме часть спецификации указывает, что реализации должны указывать, является ли внутреннее представление числа реализацией "точным" или нет.Например, 1/2 всегда точное, 1/3 точное, 0.3333 точное и т. Д. И т. Д. Но результат неточной математической операции с точным числом может привести к получению числа, которое реализация Схемы знает как неточное (из-за плавающего числаточная точность).

(exact? (/ 0.33333 2))
=> #f

Это неверно, поэтому это не точно.

Есть ли способ вывести ту же информацию в Ruby?Если я всегда буду использовать Complex (или Rational) представление числа во время математических операций, будет ли оно всегда быть точным в Ruby или просто очень близко к точному?

Complex("0.33333") / 2

Это точно или нет?

1 Ответ

5 голосов
/ 01 декабря 2011

класс Руби Float равен не точно .Класс Integer, с другой стороны, более или менее "есть", так как он плавно переходит от Fixnum к Bignum

>> 1.4534346345235236346363574564356435
=> 1.45343463452352
>> 10**400
=> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10.0**400
=> Infinity

Похоже, что другие хотели бы увидеть тест, о котором вы спрашиваетеа именно Numeric#exact? - см. запрос функции .

...