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

Каким образом можно улучшить точность результатов при делении с использованием жк дисплея и матричной клавиатуры 4x4 на atmega16 в проекте "простой калькулятор", особенно при получении чисел с плавающей точкой и более чем пятью цифрами перед запятой в среде программирования microchip studio 7? Я пробовал переключиться с типа данных float на double и экспериментировал с параметрами функции dtostrf() без успеха. Чем можно объяснить данную проблему? ссылка на материал к заданию: https://cloud.mail.ru/public/B8F6/5qiVUWmMa
  • 19 декабря 2023 г. 12:37
Ответы на вопрос 2
Возможная причина снижения точности функции dtostrf() при обработке чисел с шестью или более цифрами до запятой заключается в ограничении количества значащих цифр (significand) для чисел типа float и double. 

Тип данных float имеет около 7-8 значащих цифр, в то время как тип данных double имеет около 15-16 значащих цифр. Если число имеет больше значащих цифр, то последние цифры могут быть потеряны при конвертации в строку с помощью функции dtostrf(), что приводит к потере точности.

Чтобы улучшить точность результатов при делении с использованием жк дисплея и матричной клавиатуры 4x4, можно рассмотреть следующие подходы:

1. Увеличение количества оперативной памяти: Повышение точности может потребовать большего объема памяти для сохранения чисел с высокой точностью. Убедитесь, что у вас достаточно памяти для хранения всех необходимых значений.

2. Использование более точного типа данных: Перейдите от типа данных float к double или long double, чтобы получить более высокую точность. Убедитесь, что все используемые переменные и функции поддерживают выбранный тип данных.

3. Избегайте округления и потери значащих цифр: Если вы делаете промежуточные вычисления или операции с плавающей запятой, убедитесь в отсутствии округления и потери значащих цифр. При необходимости можно использовать дополнительные переменные с более высокой точностью для сохранения результатов промежуточных вычислений.

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

Обратите внимание, что микроконтроллер ATmega16 имеет ограниченные ресурсы и может иметь ограниченную поддержку более точных типов данных и библиотек. При выборе и реализации улучшений убедитесь, что они соответствуют возможностям и ограничениям вашего устройства.
В том что это 8-битный контроллер и операции с плавающей точкой на семействе AVR Atmel выполняются с погрешностью. Посмотрите код деления double на double в ассемблере или поверьте на слово, оперируя float/double вы получите погрешность, даже с меньшим количеством знаков перед/после запятой, проявляющуюся случайно. Если вам требуется повышенная точность, используйте int, где то там была библиотека, реализующая хранение float в двух переменных int и операции с ним
Похожие вопросы