Взирая на нынешнее состояние отечества моего с таковым оком, каковое может иметь человек, воспитанный по строгим древним правилам, ... не могу я не дивиться, в сколь краткое время повредились повсюдно нравы в России. (с) кн. М.М. Щербатов.
-
- Вы уже три поста написали , что все просто. Напишите пример
алгоритма как вычислять среднее трех чисел. Для безнаковых
65535,0,1 или если вы хотите знаковые то 32766,32767, -32768. - Anvar(26.06.2024 06:24)
- Так Вам мало одного поста. Я же рекомендовал уже: введите вторую переменную, смешенную на четверть оборота от основной. И обрабатывать ее параллельно. В тот момент, когда основная переходит через ноль, вспомогательная будет вполне гладкой. И да. При самой идеальной механике показания все равно будут скакать. - Kpoк(26.06.2024 11:10)
- Я вам ниже уже пояснял, что нужно учитывать период. Для беззнаковых чисел 65535, 0, 1 арифметика (с учетом выхода за границы
периода) получается такая:
[65535+(0+65536)+(1+65536)]/3=196608/3=65536. Результат усреднения
вновь приводим к периоду, вычитая его (периода) значение (65536) до
тех пор, пока результат не станет меньше периода =>
65536-65536=0. Итоговый результат усреднения = 0. Плюсом идет информация об
одном полном обороте reZident(35 знак., 26.06.2024 11:08)
- Нет, не получается такой арифметики. 0/3=0, а (0+65536)/3=21845.
Переполнение можно не учитывать только если нет операций деления, с
делением все становится сложнее. AlexBi(147 знак., 26.06.2024 11:18, ссылка)
- Если я правильно понял резидента, оно работает - вы фиксируете
переход и в зависимости от этого прибавляете или не прибавляете
65536. Так и делается, просто не нравится. Кстати в моем случае
энкодер 18 разрядный - шкала 262144, но это сути не меняет - Anvar(26.06.2024 11:35)
- Как-то так? SciFi(325 знак., 26.06.2024 11:49)
- Возможно, если по времени уложится, не люблю я в прерывания, циклы
вставлять - Anvar(26.06.2024 12:19)
- Теологический вопрос, а если компилер развернет цикл, остается ли
он циклом? - Andreas(26.06.2024 13:25)
- С циклами проблема не в этом. Вы его делаете, скажем 10, проходит 5
лет, вы лезете в код и думаете, а почему бы не сделать 1000? Будет
же только лучше! - Anvar(26.06.2024 13:35)
- Просто надо рядом написать комментарий с гневным предостережением. - SciFi(26.06.2024 13:37)
- А еще добавить ASSERT , что бы оно не компилировалось, если гневное предостережение не будет учтено. - AlexBi(26.06.2024 17:13)
- Только вчера залез в чужой код и в комменте к константе А гневное
предостережение, что ее менять надо обязательно вместе с константой
В, причем полстроки восклицательных знаков. Но константы В в коде
нет вообще и похожего по написанию нет, много думал. ) - Andreas(26.06.2024 13:41)
- Есть такая тема ,по прошествии 20 лет, иногда проще новый код написать - Anvar(26.06.2024 13:44)
- Просто надо рядом написать комментарий с гневным предостережением. - SciFi(26.06.2024 13:37)
- С циклами проблема не в этом. Вы его делаете, скажем 10, проходит 5
лет, вы лезете в код и думаете, а почему бы не сделать 1000? Будет
же только лучше! - Anvar(26.06.2024 13:35)
- А как же среднее арифметическое без цикла? Хочу всё знать. - SciFi(26.06.2024 12:23)
- Без коррекции перехода пока так. Ессно дает ошибку при переходе Anvar(1663 знак., 26.06.2024 12:51)
- Запросто, кольцевой буфер с указателями - новый добавил, совсем
старый вычел. - Andreas(26.06.2024 12:25)
- Сумма по скользящему окну? Мы тут с переходом через ноль никак не
разберёмся, а эта штука вообще добьёт :-) - SciFi(26.06.2024 12:26)
- Возможно, таких умных слов не знал. Это очередь, при поступлении
элемента он прибавляется к сумме, выходящий с другого конца очереди
элемент вычитается из суммы. Если очередь инициализировать нулями,
то в сумме всегда будет сумма элементов очереди. - Andreas(26.06.2024 13:23)
- Применимо только для целых чисел. При использовании плавучки очень
быстро ошибка округления суммы накапливается. Поэтому если буфер
небольшой, то надежнее каждый раз сумму считать. - reZident(26.06.2024 15:28)
- Как-то незаметно в какой-то момент энкодер начал выдавать коды в плавучке. Обожаю сахару :-) - SciFi(26.06.2024 15:32)
- Причём "прибавляется и вычитается" можно заменить на "добавляется
разность элементов", а разность вычислять правильным образом со
знаком. Тогда скользящая сумма не подвержена ошибке перехода через
ноль. - SciFi(26.06.2024 13:32)
- Да, можно перейти к виртуальному инкрементальному энкодеру, тоже вариант - Anvar(26.06.2024 13:37)
- Применимо только для целых чисел. При использовании плавучки очень
быстро ошибка округления суммы накапливается. Поэтому если буфер
небольшой, то надежнее каждый раз сумму считать. - reZident(26.06.2024 15:28)
- Возможно, таких умных слов не знал. Это очередь, при поступлении
элемента он прибавляется к сумме, выходящий с другого конца очереди
элемент вычитается из суммы. Если очередь инициализировать нулями,
то в сумме всегда будет сумма элементов очереди. - Andreas(26.06.2024 13:23)
- Сумма по скользящему окну? Мы тут с переходом через ноль никак не
разберёмся, а эта штука вообще добьёт :-) - SciFi(26.06.2024 12:26)
- Теологический вопрос, а если компилер развернет цикл, остается ли
он циклом? - Andreas(26.06.2024 13:25)
- Возможно, если по времени уложится, не люблю я в прерывания, циклы
вставлять - Anvar(26.06.2024 12:19)
- Что бы "зафиксировать переход" придется реализовать некий алгоритм обнаружения перехода, написать лишний код, хотя можно обойтись без этого. - AlexBi(26.06.2024 11:47)
- Усреднять только знаковые приращения, в которых нет переполнения и
раз в N отсчетов среднее приращение перекидывать в смещение и
среднее приращение обнулять. Я так понял и в этом может и есть
смысл, если период опроса намного меньше частоты вращения энкодера. - Andreas(26.06.2024 11:44)
- Это кстати идея. Я вспомнил, я с инкрементными энкодерами это делал. А тут проблема видимо в том, что аппаратный, но без счетчика оборотов. Кстати есть аппаратные со счетчиками оборотов, видимо для этих целей тоже - Anvar(26.06.2024 12:04)
- +1. Похожая история с отслеживанием времени. В пределах периода аппаратного таймера можно спокойно отсчитывать задержки. Для более длительных промежутков нужно время от времени (но снова в пределах периода) давать приращение счётчику с бОльшим числом разрядов. - SciFi(26.06.2024 11:47)
- Не-не, прибавлять и вычитать нужно период! Ну как у синуса или косинуса период 2π. - reZident(26.06.2024 11:40)
- Но у вас же неуниверсальная формула? [65535(тут не прибавляем 65536, а дальше почему-то
прибавляем) +(0+65536)+(1+65536)]/3=196608/3=65536. И это почему-то - переход через "0" т.е. его
нужно анализировать и применять разные формулы. У меня буфер, если
что, на 10 значений - Anvar(26.06.2024 12:12)
- Дык 65535 меньше же периода. Вообще идея в том, чтобы от функции, определенной на отдельном отрезке (периоде), перейти к непрерывной периодической функции. По типу синуса. Но поскольку вам как результат нужно именно значение на заданном отрезке, то период из результата нужно убирать (вычитать). - reZident(26.06.2024 12:47)
- После деления в результат будет добавлено не целое число периодов - AlexBi(26.06.2024 11:49)
- Но у вас же неуниверсальная формула? [65535(тут не прибавляем 65536, а дальше почему-то
прибавляем) +(0+65536)+(1+65536)]/3=196608/3=65536. И это почему-то - переход через "0" т.е. его
нужно анализировать и применять разные формулы. У меня буфер, если
что, на 10 значений - Anvar(26.06.2024 12:12)
- Как-то так? SciFi(325 знак., 26.06.2024 11:49)
- Я вам больше скажу, 0 можно делить на любое число, все равно 0
получится :-))) В вашем сообщении нет логики. Зачем делить сумму из
одного значения на 3? Среднее арифметическое считается как Xср =Ʃ(Xi)/N, где i=1...N. Для N=1 делитель 1, а не 3! :-P - reZident(26.06.2024 11:30)
- Вы предлагаете ко всем добавить период (65536)? Если да, то почему
к 65535 не добавили? - AlexBi(26.06.2024 11:50)
- Период добавляется (или вычитается) при переходе через границу периода. - reZident(26.06.2024 12:02)
- Вы предлагаете ко всем добавить период (65536)? Если да, то почему
к 65535 не добавили? - AlexBi(26.06.2024 11:50)
- Если я правильно понял резидента, оно работает - вы фиксируете
переход и в зависимости от этого прибавляете или не прибавляете
65536. Так и делается, просто не нравится. Кстати в моем случае
энкодер 18 разрядный - шкала 262144, но это сути не меняет - Anvar(26.06.2024 11:35)
- Нет, не получается такой арифметики. 0/3=0, а (0+65536)/3=21845.
Переполнение можно не учитывать только если нет операций деления, с
делением все становится сложнее. AlexBi(147 знак., 26.06.2024 11:18, ссылка)
- Простые вещи самые сложные для объяснения :(( Я пытаюсь донести то факт, что вычисления с целыми числами на современных процессорах это арифметика по модулю 2N. Результаты арифметических операций это остаток от деления "настоящих" математических целых чисел на 2N. И что в данном случае это не столько мешает, сколько помогает. - ЫЫyкпy(26.06.2024 07:29)
- В двоичном виде 65535 выглядит так же как и -1. Неудивительно что результат будет =0. ЫЫyкпy(123 знак., 26.06.2024 07:11)
- Вы уже три поста написали , что все просто. Напишите пример
алгоритма как вычислять среднее трех чисел. Для безнаковых
65535,0,1 или если вы хотите знаковые то 32766,32767, -32768. - Anvar(26.06.2024 06:24)