![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Cheese |
|
||||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 25.11.2007 Репутация: нет Всего: нет |
Суть проблемы: надо из double сделать int, убрав дробную часть. Казалось, бы всего ничего, преобразовать в int, но не работает, причём выдаёт воистину чудовищный результат: 6.000000 превращается в 5. Подозреваю, что тут что-то с точностью, так как если сделать не double а long double проблема исчезает. На некоторое время, потому что если взять число побольше, опять n превращается в n-1. Пробовал не (int) y, а floor(y) - та же проблема.
Вот пример, чтобы не быть голословным:
Здесь формируется игрик, через складывание множества дробных чисел. При этом программа выдаёт:
Последняя строка убивает. Товарищи, в чём дело? Работаю в линуксе, через gcc. Это сообщение отредактировал(а) Cheese - 22.7.2009, 18:55 |
||||
|
|||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
Ну да, проблема с точностью. Если нужно так обрабатывать только числа, фактически являющиеся целыми, то просто прибавляйте 0.5 перед отбрасыванием дробной части.
|
|||
|
||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Похоже на то что printf округляет значение. Выглядит правдоподобно, если, например, y = 5.9999999 Я угадал. Попробуй это:
Правильнее будет сделать так: printf( "y = %.20f, y_rounded = %.0f\n", y, y ); Это сообщение отредактировал(а) Леопольд - 22.7.2009, 21:56 -------------------- вопросов больше чем ответов |
||||||
|
|||||||
codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 1 Всего: 39 |
|
|||
|
||||
PirateTigo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 4.8.2008 Репутация: нет Всего: нет |
у Вас написано так:
а если попробовать так:
? Это сообщение отредактировал(а) PirateTigo - 1.8.2009, 23:45 |
||||
|
|||||
VC15 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 4.8.2009 Репутация: нет Всего: нет |
Да, дело здесь именно в том, что printf округляет. Поэтому на самом деле в y хранится 5.99999999, а выводится 6.0000. Чтобы избавиться от этой проблемы, я предлагаю использовать printf( "y = %f, y_rounded = %i\n", y, int(y + 1e-9) );
Это сообщение отредактировал(а) VC15 - 4.8.2009, 17:28 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |