Дважды за день попался на "детских" ошибках с вычислениями.
Надо было перенести вычислительный алгоритм с компа в микроконтроллер.
1. Я был предупреждён, что в PIC32 типы float и double эквивалентны. Если хочешь получить что-то побольше, чем 32 бита, надо писать long double. Поэтому я решил -- а, пофиг, напишу float. Алгоритм заработал, но в одном месте показывал смещённые результаты. Причём чем дальше, тем больше было смещение. Да, это набегала ошибка при проведении повторяющихся операций (сложения). Написал long double, заработало.
2. В другом месте решил, что чтобы было поточнее, буду пока есть возможность проводить вычисления с целыми числами. Там было умножение. Я перемножил два инта. А потом смотрю, чего это у меня результаты вычислений не зависят ни от чего вообще. Что ни делаю, получаю 0.5 повторяемо (после всех других вычислений). Эти инты содержали в себе результаты считывания с 18-битного АЦП. А произведение двух 18-битных чисел это 36-битное число. Оно не влезало в 32-битную разрядную сетку. У меня постоянно возникало переполнение. Стал эти числа приводить к long double ещё до умножения. Сразу всё стало правильно.
long double спасает мир
zHz00
| среда, 12 августа 2020