zHz00 Untitled

понедельник, 08 сентября 2014
19:52 В любой непонятной ситуации падайте на потолок
Оказалось, что программа возвращает для отрицательных чисел результат на единицу больше (ближе к нулю), чем нужно. Для положительных работает нормально. Смотрим в книгу, видим фигу:

x=int(a+0.5);

Эта штука и правда округляет правильно только положительные числа. Слава богу, её писал не я. Она в коде уже много лет, но случаев, когда эта разница в единицу была бы важна, раньше не было. Тут у меня в голове что-то скребётся... где-то я уже что-то такое видел, хм... и тут я вспоминаю, как правильно!

x=floor(a+0.5);

Заработало!

Но где, где же я видел это правильную запись округления в Си? В книжке Бобровского. Мне её купили, когда я ещё в школе увлекался Си++ Билдером (я и сейчас его сильно уважаю). Тогда-то я её прочитал с интересом, но сейчас понимаю, что книжка -- не очень. Это первый случай, когда та книжка оказалась полезной.

@темы: Программирование, Борьба с техникой

URL

08.09.2014 в 22:26

08.09.2014 в 22:26
Опять ничего не понял.
URL

09.09.2014 в 06:58

09.09.2014 в 06:58
А самому написать?

return a > 0 ? int(a+0.5) : int(a-0.5);
URL

09.09.2014 в 07:47

09.09.2014 в 07:47
это еще повезло, что надо всегда округлять в большую сторону.
Вот на такие грабли IEEE 754 надо тоже наступать с осторожностью:
round((0.3 - 0.2) * 10.0 + 0.5)
URL

09.09.2014 в 12:40

09.09.2014 в 12:40
Чорт, они все это понимают...
URL