ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
27 февраля
1572869 Топик полностью
Nikolay_Po (Сегодня, 10:49, просмотров: 34) ответил Dingo на А вот этот способ прямо заинтересовал. Можете пример привести?
Так, например: 
MassDelta1024 = ((uint64_t)MassSpeed_dph * TimeDelta * 1024u + SystemSpeedDivider / 2) / SystemSpeedDivider;// Account for total mass for the period


Получаю целые значения в 1/1024 от целевого разрешения. Благодаря запасу размера, нет проблем с переполнением. Переменные, участвующие в расчёте - вычисляются заранее, перед запуском рабочего цикла. Умножения/деления на 2^N делаются быстро, сдвигами. Остаётся одна операция с делением uint64/uint64. ЦП имеет поддержку целочисленного деления на 32 бита, поэтому за несколько коротких подходов, вычисляет 64/64.


Возможность переполнения проверена для крайних значений переменных, которые защищены от выхода за допустимые рамки.


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