2013-02-11 4 views
0

EDIT: появляется во времениv.h, что вторые секунды представлены как целые числа вместо поплавков?Ошибка округления в Ruby Time

Даже если я знаю, что ошибки округления, связанные с реализацией IEEE 754 плавающих значений, я очень удивлен этому:

Time.utc(1970,1,1,0,0,12.860).strftime("%H:%M:%S,%L") # => "00:00:12,859" 

Обычно точность ошибок для 8-го или 10-го знака после запятая, и я хорошо понимаю, почему. Но в этом случае влияет последняя значимая цифра моего значения, и это, по-видимому, является более серьезной ошибкой, чем в других известных случаях точности. Более того, это часть класса Time, и я не знаю, как это исправить в программе. Другие сообщенные ошибки округления float иногда могут быть исправлены с использованием разных классов, но в этом случае я не вижу никакого интересного класса для использования.

Моя среда:

[email protected] ~ % uname -a                11-02-2013 09:38:49 
Linux eldiablo.loria.fr 3.5.0-23-generiC#35-Ubuntu SMP Thu Jan 24 13:05:29 UTC 2013 i686 i686 i686 GNU/Linux 
/home/phil 
[email protected] ~ % ruby -v                 11-02-2013 09:38:51 
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux] 

EDIT: Итак, два вопроса по этому поводу: Является ли это или не ошибка? И как справиться с этим побочным эффектом, если мне нужна такая точность с классом Time? Любая идея или обходной путь?

+0

Поскольку я не знаю внутренней реализации класса Time, я хотел бы быть уверенным, что это не ошибка, что может считаться моим первым вопросом. Второй вопрос - как справиться с этим побочным эффектом, если мне нужна такая точность с классом Time? –

+0

Еще одно замечание: если я хорошо понимаю исходный код, то субсекунды в классе времени определяются как VALUE, т. Е. Как целое число без знака, то есть не как float. В этом случае, как может произойти такая ошибка? –

ответ

0

Кажется, что эта ошибка возникает из-за того, что поплавковая строка обрезана без округления поплавка. Когда вы смотрите на

Time.utc(1970, 1, 1, 0, 0, 12.860).subsec 
#=> (60517119992791/70368744177664) 

При преобразовании его плавать дает

Time.utc(1970, 1, 1, 0, 0, 12.860).subsec.to_f 
#=> 0.8599999999999994 

поведение, которое вы видите, может быть понято как ошибка, а также функции. На мой взгляд, это заслуживает исправления до более интуитивного результата. На мой взгляд, вы должны пойти на http://bugs.ruby-lang.org/ и сообщить об этом сюрприз.

+0

Спасибо за ваш ответ! –

+0

Вот что значит для :-) Когда вы останетесь здесь дольше, вы узнаете все о манерах, а также о SO-контента нацистов :-) –

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