Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с float 
:(
    Опции темы
daemonaz
Дата 20.9.2013, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Помогите разобраться, возникли проблемы с типом данных float, вместо одних чисел я получаю другие, например, вместо 35.7 в отладочном режиме вижу 35.79999999999, это число является константой, которое присваиваю переменной типа float. 
Как с этим бороться?



PM MAIL   Вверх
Guinness
Дата 20.9.2013, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Код в студию.
PM MAIL   Вверх
daemonaz
Дата 20.9.2013, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Guinness, код достаточно простенький, в qtsdk в консольном режиме, в комментариях число, которое выдает отладчик
Код

int main(int argc, char *argv[])
{
    double tmpD1 = 6.34; // 6.3399999999999999
    double tmpD2 = 6.35; // 6.3499999999999996
    double tmpD3 = 6.36; // 6.3600000000000003
}

когда умножаю например tmpD2 на 100 чтобы получить целое число, то получим уже не 635, а 634, дальнейшее вычисление с этими числами даст самые непредсказуемые ошибки.
round() не предлагать, ибо код обкатываю на Qt, затем переношу на микроконтроллер, где лишние функции сокращают производительность.
Хотелось бы понять это ошибки или особенности компилятора?

Это сообщение отредактировал(а) daemonaz - 20.9.2013, 15:40
PM MAIL   Вверх
Guinness
Дата 20.9.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



А как выводишь числа?
Ну, а вычисления связанные с числами с плавующей точкой, всегда подвержены погрешностям хранения десятичного числа в двоичном виде.
PM MAIL   Вверх
disputant
Дата 21.9.2013, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(daemonaz @ 20.9.2013,  15:37)
когда умножаю например tmpD2 на 100 чтобы получить целое число, то получим уже не 635, а 634

А для округления к ближайшему перед умножением на 100 прибавить 0.005?
PM MAIL   Вверх
Alexeis
Дата 21.9.2013, 10:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 1
Всего: 459



Цитата(daemonaz @  20.9.2013,  15:07 Найти цитируемый пост)
 вместо 35.7 в отладочном режиме вижу 35.79999999999, это число является константой, которое присваиваю переменной типа float. 
Как с этим бороться?

  Не использовать двоичную систему счисления для хранения таких чисел. Потому как это результат непредставимости десятичного числа в двоичной форме. Если у вас контроллер ожидается, то я бы совсем рекомендовал отказаться от типа float, поскольку на системах без сопроцессора он вычисляется не особо быстро. Можно использовать целые числа умноженные на степень двойки. Например, 6.34 , будет  6.34 * 1024 ~ 6492 . Но мы всегда помним, чтобы получить правильное число нужно делить на 1024. Ну или использовать множитель 1000, тогда представление будет еще более наглядным. Будет 6340. Дело в том что целые десятичные числа всегда представимы двоичным числом, а десятичные дроби нет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
daemonaz
Дата 21.9.2013, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Alexeis, спасибо за развернутый ответ! 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.