@DWer19

Почему точность функции dtostrf() снижается при обработке чисел с шестью или более знаками перед запятой?

Всем добрый день!

Эта функция понадобилась мне в проекте "калькулятор" на atmega16 с использованием жк дисплея и матричной клавиатуры 4x4(среда программирования microchip studio 7)

Обнаружил, что при делении, приводящем к получению числа с плавающей точкой и более чем пятью цифрами перед запятой, результат является неточным.

Пробовал вместо float - double, экспериментировал со всеми параметрами dtostrf(). Безуспешно.

Очень интересно в чем же все-таки проблема.

https://cloud.mail.ru/public/B8F6/5qiVUWmMa
  • Вопрос задан
  • 224 просмотра
Решения вопроса 2
@mordo445
В том что это 8-битный контроллер и операции с плавающей точкой на семействе AVR Atmel выполняются с погрешностью. Посмотрите код деления double на double в ассемблере или поверьте на слово, оперируя float/double вы получите погрешность, даже с меньшим количеством знаков перед/после запятой, проявляющуюся случайно. Если вам требуется повышенная точность, используйте int, где то там была библиотека, реализующая хранение float в двух переменных int и операции с ним
Ответ написан
@kalapanga
Так устроен формат чисел float. Он представляет собой 4 байта или 32 бита. Из них 1 бит знаковый, 8 бит на экспоненту и 23 бита на мантиссу. Соответственно, точность не может превышать 6-7 знаков. Больше хранить негде!
Источники:
float - Arduino Reference
Type float | Microsoft Learn
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы