Ну и во всех случаях умножением на константу это
не будет, будет именно что вычитанием константы. И похоже на умножение оно будет лишь для достаточно больших чисел, скажем в верхней трети полного диапазона. А в остальном диапазоне с приближением исходного числа к 0 "умножение" будет на всё более отличный от 1 коэффициент, вплоть до
для ADCW=2 (из 1023). Для отображения на экране это не страшно, а вот для любой математики нестабильность коэффициента умножения - надо изучать как повлияет.
Если нужна лучшая точность, то переходите на 32-х битную арифметику, тогда погрешность не превысит
. Например:
int32_t a = 0; uint16_t b;
b = ADCW;//Тут для понимания удобнее выравнивание вправо, с диапазоном 0..1023
if (b != 0) a = ((uint32_t)(b << 5) << 16) - (int32_t)b;
В любом случае это гораздо быстрее умножения, хоть плавающего, хоть целочисленного.
-- 25.05.2018, 15:22 --А так?
Точность всего
... При -1000<a<+1000 умножения вообще не происходит и коэффициент становится равен строго
что для ТС недопустимо.
То что Вы написали, мне не понятно:
если a не рано нулю и если она отрицательная то увеличиваем на 1, или, если строго положительная, то уменьшаем на 1,
и сами же пишите - если ADCW=1 то она обнулится.
Что же здесь непонятного, всё в коде видно, это я к тому что предложенное Вами уменьшение на 1 не является именно умножением. Особенно для малых чисел.
Смысл весь в том, чтобы маленькие не трогать, а уменьшать только большие значения. Только тогда эта операция станет эквивалентной умножению.
Не станет, ведь тогда для маленьких коэффициент станет равен строго
и ваш фильтр сломается как Вы говорите.
-- 25.05.2018, 15:27 --Это совсем не то. Это не умножение на 0.9999 а обнуление последнего разряда.
Для положительных чисел - да, для отрицательных - нет: -1001 превратится в -1000, младшие
4 бита у них разные! Именно поэтому и нужна проверка знака, а не просто обнуления младшего бита.