Форум » Для начинающих. » Округление чисел по уровню 0.5 » Ответить

Округление чисел по уровню 0.5

vintik: Есть у меня программа деления. Дополнил я ее программкой округления числа. Тоесть то, что остается в неделимом остатке, округляется и прибавляется или нет к целой части. И встал вопрос, нужно ли это? Ведь при округлении дискретность не повышается. Без округления переключение (смена цифры), будет по целой части. А с округлением по полтарушкам (1.5; 2.5; 3.5...). К примеру, был у меня термометр. И при температуре 20,1*С он показывал уже 21*С. Тут, как бы округление уместно, но ведь можно просто к результату прибавить 0,5 (или отнять, в зависимости от коррекции) и переключение будет уже по (псевдо)уровню. От 19,5 до 20,4 на индикаторе будет цифра 20. Или я чего то упустил?

Ответов - 19

Bigor: vintik, очень хорошая идея. Если Ваш термометр показывает целые градусы (два разряда), а реально измеряет до десятых градуса, а десятые доли градуса не индицируются, то подобное округление вполне оправдано. Если же точность измерения один градус, то это излишество. Программу деления с округлением числа отправить в Обмен не планируете?

MAZ: Округление по уровню 0,5 дает более полную (точную картину) результата. Например: Результат 2,1276, без округления 2. Результат 2,9767, без округления тоже 2. Но число, почти 3. Растет большая погрешность вычислений. С округлением. до 2,5 =2. После 2,5 =3 Если нужно более точная процедура, то считают десятые, сотые и т.д. vintik пишет: От 19,5 до 20,4 на индикаторе будет цифра 20. Прибавить или отнять 0,5 это будет именно тоже округление по уровню 0,5.

vintik: Форум закрытый, думаю можно и здесь выложить. Вот собственно предмет разговора [pre];--------------------------------------------------------------------------------------- ;П/П ДЕЛЕНИЯ с округлением по уровню 0.5 и проверкой делителя на "0". ; Вход AARGB0,AARGB1 16бит делимое; BARGB0 8бит делитель. ; Выход AARGB0,AARGB1 16бит результат. ; Максимум 243 м.ц. ;--------------------------------------------------------------------------------------- DEL movlw .16 movwf Count ; Регистр счетчика циклов movf BARGB0,W ; Проверка делителя на "0" skpnz ; return ; Выход если BARGB0 = 0 clrf BARGB0 POVTOR rlf AARGB1, F ; rlf AARGB0, F rlf BARGB0, F ; Запись через битС rlf Count, F ; Сохранить битС в Count,0 subwf BARGB0, F ; skpnc ; bsf Count, 0 btfss Count, 0 ; addwf BARGB0, F ; clrc ; Сброс бит "C" рег. "STATUS", rrf Count, F ; для восстановления счетчика decfsz Count, F ; goto POVTOR rlf AARGB1, F ; Итог деления в rlf AARGB0, F ; двух регистрах "AARGB0" и "AARGB1" ;округление по уровню 0.5 ; movf AARGB1,F ; skpz ; goto $+4 ; movf AARGB0,F ; skpnz ; return ; movwf Count ; W=>Count ; clrc ; Сброс бита "C" рег. "STATUS" ; rrf Count,F ; Count/2 =>Count ; movf Count,W ; skpnz ; Если Count=0 выход ; return ; subwf BARGB0,F ; BARGB0-W =>BARGB0 ; skpnc ; Если результат положительный ; incf AARGB1,F ; то (AARGB1+1) => AARGB1 Младший байт ; skpnz ; Если был перенос, то ; incf AARGB0,F ; то (AARGB0+1) => AARGB0 Старший байт return[/pre] Вес (масса) вопроса 15 команд. По факту. мне нужно один байт разбить на 100 кусочков. Измеренное значение (0-100) сначала умножаю на 256, а потом делю на 100.


vintik: Александр, у нас ведь дискретность остается одна, равная 1. Дискретность как при 2.0-3.0, так и при 2.4 – 3.4 равна 1. Только смещена на 0.5 (во всем диапазоне), и если есть возможность сместить измеренное, (подрегулировать опорное напряжение компаратора), то и переключение также сместится (коррекция).

Вячеслав: Аппаратная погрешность измерительного прибора (дискретность, температурная погрешность, временная погрешность и пр.) должна быть видима оператору при метрологической аттестации. При проведении "обычных" измерений весь "мусор" должен скрываться за пределы индуцируемой величины. Отсюда возникает необходимость, при обработке результата измерения, в программе округления. Или я неправ? Кроме того, вырисовываются ( если позволяют аппаратные возможность) два режима работы индикатора - полный (для отслеживания температурных, временных изменений) и штатный (округлении и прочими поправками). ИМХО - вырисовывается подпрограмма обработки результата измерения.

Алексей: Вопрос то в чем? Если надо корректно округлить до целых то очень просто. Берете самый левый бит дробной части, если он =0 то просто отбрасываем дробную часть, если =1 то к целой части прибавляем 1...

Sergey Roslik: Алексей пишет: Вопрос то в чем? Если надо корректно округлить до целых то очень просто. Берете самый левый бит дробной части, если он =0 то просто отбрасываем дробную часть, если =1 то к целой части прибавляем 1... А какой смысл тогда в округлении? Прще уже вывести десятичное значение.

MAZ: vintik пишет: (подрегулировать опорное напряжение компаратора) Я имел ввиду общий смысл. Просто вычисления. Например, сейчас делал стабилизацию двигателя. Если не делать округление,( и именно по уровню 0,5). ошибка которая заложена в конструкции увеличивается в два раза. Если делать, то все что возможно. Кстати, можно и десятичные высчитывать и сотые. Ошибка та же. Наверно, верней сказать, как мы хотим в дальнейшем использовать результат округления.

Алексей: Sergey Roslik пишет: А какой смысл тогда в округлении? Прще уже вывести десятичное значение. Это ты о чем?

Sergey Roslik: Алексей пишет: Берете самый левый бит дробной части Я так понял, что округление необходимо для вывода без десятичных знаков, а если есть десятичные, то зачем их округлять. Их выводить надо, а не делать на них расчёт.

vintik: MAZ пишет: Я имел ввиду общий смысл. Просто вычисления. Наверное Вы все в чем то правы. Если делитель за каждым вычислением меняется, то наверное есть смысл округлять. А если в моем случае (делитель 100), то наверное можно и обойтись. Собственно сам случай: Есть датчик давления с пределом 100 см. водного столба. На его выходе меняется напряжение 0-5В. Я оцифровываю это напряжение одним байтом. С другого конца, энкодер с индикацией уставки на ЖКИ. Вот мне и нужно крутнуть 100 щелчков, чтобы выставить регулируемое давление на 100см. водн. ст. Алексей пишет: Если надо корректно округлить до целых то очень просто. Берете самый левый бит дробной части, если он =0 то просто отбрасываем дробную часть, если =1 то к целой части прибавляем 1... Алексей, в данной программе остаток находится в W (8бит), просто проверить 7й бит?

Алексей: vintik пишет: просто проверить 7й бит? Просто проверить... и добавить единцу к целой части, если =1... Картина такая: [pre2]2^7, 2^6, 2^5, 2^4, 2^3, 2^2, 2^1, 2^0. 2^-1, 2^-2, 2^-3, 2^-4, 2^-5, 2^-6, 2^-7, 2^-8 Целая часть Дробная часть[/pre2]

Алексей: vintik пишет: энкодер Наверное валкодер?

vintik: Алексей, я ошибся в этой прогр. деления в W находится делитель, а не остаток. А то, что Вы показали я один черт не понял. Может проще пример? Здесь все нацело поделилось: 60-30=30 30-30=0 или 0000 0000 Здесь остаток 2 и меньше половины делителя, увеличения на 1 нет: 62-30=32 32-30=2 0000 0010 2-30= -28 1110 0100 Здесь остаток равен половине делителя и 1 прибавляется. 75-30=45 45-30=15 0000 1111 15-30= -15 1111 0001 В общем не понятно, по какому биту ориентироваться?

vintik: Вот такойэнкодер-валкодер :)

MAZ: PEC12-4220F-S0024 50р Ругают их за надежность

vintik: MAZ пишет: Ругают их за надежность Есть и такой Кстати и программка в обмене, делающая из 500 импульсов на оборот 2000. А время обработки, если память не изменяет 70мкс с кварцем 4мГц.

MAZ: Бедная Украинская армия, бывшая советская. Но аппараты классные, ничего не скажешь.

vintik: Просмотрел в Екселе, как ведет себя ошибка. На малых(единицы) она большая, как с округлением так и без. На десятках и сотнях, это десятые доли процента. Так что удаляю П/П округления (обьем программы на высшей привилегии), всем большая благодарность за участие.



полная версия страницы