![]() |
|
|
![]()
|
|
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Помогите разобраться, возникли проблемы с типом данных float, вместо одних чисел я получаю другие, например, вместо 35.7 в отладочном режиме вижу 35.79999999999, это число является константой, которое присваиваю переменной типа float.
Как с этим бороться? |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Код в студию.
|
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Guinness, код достаточно простенький, в qtsdk в консольном режиме, в комментариях число, которое выдает отладчик
когда умножаю например tmpD2 на 100 чтобы получить целое число, то получим уже не 635, а 634, дальнейшее вычисление с этими числами даст самые непредсказуемые ошибки. round() не предлагать, ибо код обкатываю на Qt, затем переношу на микроконтроллер, где лишние функции сокращают производительность. Хотелось бы понять это ошибки или особенности компилятора? Это сообщение отредактировал(а) daemonaz - 20.9.2013, 15:40 |
|||
|
||||
| Guinness |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
А как выводишь числа?
Ну, а вычисления связанные с числами с плавующей точкой, всегда подвержены погрешностям хранения десятичного числа в двоичном виде. |
|||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
А для округления к ближайшему перед умножением на 100 прибавить 0.005? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 1 Всего: 459 |
Не использовать двоичную систему счисления для хранения таких чисел. Потому как это результат непредставимости десятичного числа в двоичной форме. Если у вас контроллер ожидается, то я бы совсем рекомендовал отказаться от типа float, поскольку на системах без сопроцессора он вычисляется не особо быстро. Можно использовать целые числа умноженные на степень двойки. Например, 6.34 , будет 6.34 * 1024 ~ 6492 . Но мы всегда помним, чтобы получить правильное число нужно делить на 1024. Ну или использовать множитель 1000, тогда представление будет еще более наглядным. Будет 6340. Дело в том что целые десятичные числа всегда представимы двоичным числом, а десятичные дроби нет. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Alexeis, спасибо за развернутый ответ!
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |