Оказалось, что программа возвращает для отрицательных чисел результат на единицу больше (ближе к нулю), чем нужно. Для положительных работает нормально. Смотрим в книгу, видим фигу:
x=int(a+0.5);
Эта штука и правда округляет правильно только положительные числа. Слава богу, её писал не я. Она в коде уже много лет, но случаев, когда эта разница в единицу была бы важна, раньше не было. Тут у меня в голове что-то скребётся... где-то я уже что-то такое видел, хм... и тут я вспоминаю, как правильно!
x=floor(a+0.5);
Заработало!
Но где, где же я видел это правильную запись округления в Си? В книжке Бобровского. Мне её купили, когда я ещё в школе увлекался Си++ Билдером (я и сейчас его сильно уважаю). Тогда-то я её прочитал с интересом, но сейчас понимаю, что книжка -- не очень. Это первый случай, когда та книжка оказалась полезной.
x=int(a+0.5);
Эта штука и правда округляет правильно только положительные числа. Слава богу, её писал не я. Она в коде уже много лет, но случаев, когда эта разница в единицу была бы важна, раньше не было. Тут у меня в голове что-то скребётся... где-то я уже что-то такое видел, хм... и тут я вспоминаю, как правильно!
x=floor(a+0.5);
Заработало!
Но где, где же я видел это правильную запись округления в Си? В книжке Бобровского. Мне её купили, когда я ещё в школе увлекался Си++ Билдером (я и сейчас его сильно уважаю). Тогда-то я её прочитал с интересом, но сейчас понимаю, что книжка -- не очень. Это первый случай, когда та книжка оказалась полезной.
09.09.2014 в 02:26
09.09.2014 в 10:58
return a > 0 ? int(a+0.5) : int(a-0.5);
09.09.2014 в 11:47
Вот на такие грабли IEEE 754 надо тоже наступать с осторожностью:
round((0.3 - 0.2) * 10.0 + 0.5)
09.09.2014 в 16:40