zHz00 Untitled

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

x=int(a+0.5);

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

x=floor(a+0.5);

Заработало!

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

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

URL
Картинку в нете нашел :))
Ну надо же, а... Девочка с дневничком...
Чего добиваются люди, осуждающие любой твой выбор ?
---------------- /userdir/0/0/6/5/0065/60496.jpg
Мы часто делим людей и поступки на добрые и злые, и счита...
см. ниже Current music: Земфира - Главное

09.09.2014 в 02:26

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

09.09.2014 в 10:58

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

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

09.09.2014 в 11:47

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

09.09.2014 в 16:40

09.09.2014 в 16:40
Чорт, они все это понимают...
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail