Хитрые, необычные алгоритмы и код
- Сообщения: 16
- Зарегистрирован: Ср мар 08, 2017 19:33:38
У кого-нибудь остался архив MULT_KNUTH.zip из сообщения https://radiokot.ru/forum/viewtopic.php ... 5&start=83 ?
- Реклама
это "тупое" суммирование частичных произведений пишется элементарно за несколько минут, без всякого чужого архива.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Умножение 32*32 занимает 132 такта, что даст алгоритм Карацубы?

Спойлер
- Вложения
-
- KNUT_32.PNG
- (72.5 КБ) 572 скачивания
- Реклама
akl, если есть аппаратная операция умножения, то мало что. Если же ее нет, то - заметное ускорение.
Здравствуйте уважаемые.Прошерстил форумы и думаю это самая подходящая ветка.Нужна помощь ибо у меня голова не варит уже.Итак задача опроса данных с оптической линейки и вывод на дисплей тм1638.Уже сделано:линейка опрашивается по прерыванию и данные выводятся на табло но! вместо одного миллиметра ,десятой , сотой отображается количество импульсов на тот самый миллиметр...один импульс это 5 микрон а одна сотка это 2 импульса по 5 микрон...пишу на си для тинки 88.Алгоритм с делилками на целочисленное значение не подходит.Может у когото есть мысли поделитесь .при необходимости кусок кода предоставлю.
Ничего не понял, но если один импульс это сколько-то микрон, то N импульсов в микроны переводятся умножением на N, а не делением...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
переменные int sot_y,dec_y,edc_y,deced_y,soted_y;
переменные temp_y1- temp_y8 хранят результаты счета для вывода на табло
if (mic_y==2){temp_y8=0;mic_y=0;if(sot_y<10){sot_y++;temp_y7=sot_y;};}else {temp_y8=5;}; если один импульс то вывожу на экран 5 а когда приходит второй вывожу 0 и добавляю сотку
if (sot_y==10){sot_y=0;if(dec_y<10){dec_y++;temp_y6=dec_y;};}; тут если собралось десять соток до добавляю десятку вывод цифр соответственно обновляется при каждой смене.
if (dec_y==10){dec_y=0;if(edc_y<10){edc_y++;temp_y5=edc_y;};}; далее все повторяется для следующих разрядов
if (edc_y==10){edc_y=0;if(deced_y<10){deced_y++;temp_y5=deced_y;};};
if (deced_y==10){deced_y=0;if(soted_y<10){soted_y++;temp_y5=soted_y;};};
переменные temp_y1- temp_y8 хранят результаты счета для вывода на табло
if (mic_y==2){temp_y8=0;mic_y=0;if(sot_y<10){sot_y++;temp_y7=sot_y;};}else {temp_y8=5;}; если один импульс то вывожу на экран 5 а когда приходит второй вывожу 0 и добавляю сотку
if (sot_y==10){sot_y=0;if(dec_y<10){dec_y++;temp_y6=dec_y;};}; тут если собралось десять соток до добавляю десятку вывод цифр соответственно обновляется при каждой смене.
if (dec_y==10){dec_y=0;if(edc_y<10){edc_y++;temp_y5=edc_y;};}; далее все повторяется для следующих разрядов
if (edc_y==10){edc_y=0;if(deced_y<10){deced_y++;temp_y5=deced_y;};};
if (deced_y==10){deced_y=0;if(soted_y<10){soted_y++;temp_y5=soted_y;};};
Последний раз редактировалось culibin 100 Вт авг 24, 2021 21:22:33, всего редактировалось 1 раз.
Понятнее не стало
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} обработчик прерывания
Добавлено after 1 minute 31 second:
[uquote="ARV",url="/forum/viewtopic.php?p=4080983#p4080983"]Понятнее не стало[/uquote]
что именно не понятно? как работает мой код ? я прибавляю по нарастающей по 5 микрон дважды для сотки и так к каждому разряду по единице до целого милиметра
Добавлено after 1 minute 31 second:
[uquote="ARV",url="/forum/viewtopic.php?p=4080983#p4080983"]Понятнее не стало[/uquote]
что именно не понятно? как работает мой код ? я прибавляю по нарастающей по 5 микрон дважды для сотки и так к каждому разряду по единице до целого милиметра
это самая НЕ подходящая ветка.culibin 100 писал(а):думаю это самая подходящая ветка.
или ты считаешь, что предложил хитрый и необычный алгоритм, чтобы другие люди могли применить его у себя?
так ты сильно ошибаешься.
в этой теме люди показывают свои "хитрости", которые могут быть полезны другим людям.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
я просил как раз подсказать мне реализовать алгоритм а не рекламирую свой.
я так и не понял, в чем проблема?
вместо простого счетчика импульсов вы применяете поразрядный (аналог BCD) счет. ну, не знаю, чем это оправдано, но вполне приемлемо.
и чо?
я бы делал иначе: считал импульсы в обычном счетчике, а уже перед выводом на индикатор производил бы вычисления и преобразования в "читабельный" вид. в прерываниях счет типа counter++, в главном цикле расчет и вывод.
никакой "необычности" или "оригинальности" в этом алгоритме нет и не нужно
вместо простого счетчика импульсов вы применяете поразрядный (аналог BCD) счет. ну, не знаю, чем это оправдано, но вполне приемлемо.
и чо?
я бы делал иначе: считал импульсы в обычном счетчике, а уже перед выводом на индикатор производил бы вычисления и преобразования в "читабельный" вид. в прерываниях счет типа counter++, в главном цикле расчет и вывод.
никакой "необычности" или "оригинальности" в этом алгоритме нет и не нужно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} вот я и делаю тут как написали типа counter++.читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.
МК по идее должен уметь считать внешние импульсы аппаратно... Может, это лучше, чем прерывание на каждый импульс?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="culibin 100",url="/forum/viewtopic.php?p=4081647#p4081647"]...читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.[/uquote]
Думаю, выражение 1000*S=5*N решит проблему. S[мм]-отсчет энкодерной линейки. 1000 учитывается десятичной точкой на табло.
Если счетчик с каждым импульсом изменяет свое состояние на 5, умножение не нужно. Для энкодера счетчик должен быть реверсивный. В прерывании определяется направление и меняется состояние счетчика.
Думаю, выражение 1000*S=5*N решит проблему. S[мм]-отсчет энкодерной линейки. 1000 учитывается десятичной точкой на табло.
Если счетчик с каждым импульсом изменяет свое состояние на 5, умножение не нужно. Для энкодера счетчик должен быть реверсивный. В прерывании определяется направление и меняется состояние счетчика.
попробую разобраться.. точка при целых миллиметрах у меня отображается постоянно. и что в выражении 1000*S=5*N значит N?
N это число импульсов энкодера.
N=199 S=0.995; N=200 S=1.000; N=201 S=1.005
N=199 S=0.995; N=200 S=1.000; N=201 S=1.005
в чем разница S[мм]-отсчет энкодерной линейки. от N это число импульсов энкодера?мне же и нужно из импульсов сделать миллиметры соответственно из N получить S. из формулы понятно что
N (то что насчитало прерывание от линейки множим на 5 микрон за каждый импульс ) затем делим на 1000 и получаем реальное кол-во мм ( некое число DATA_Y) которое нужно отобразить на табло?
отображаю таким алгоритмом
temp_y1 =16;//INDEX_NEGATIVE_SIGN;
temp_y2 = DATA_Y/1000000%10;//Вывод цифры - "7"
temp_y3 = DATA_Y/100000%10; //Вывод цифры - "6"
temp_y4 = DATA_Y/10000%10; //Вывод цифры - "5"
temp_y5 = DATA_Y/1000%10;//Вывод цифры - "4"
temp_y6 = DATA_Y/100%10; //Вывод цифры - "3"
temp_y7 = DATA_Y/10%10; //Вывод цифры - "2"
temp_y8 = DATA_Y/1%10;//Вывод цифры - "1"
N (то что насчитало прерывание от линейки множим на 5 микрон за каждый импульс ) затем делим на 1000 и получаем реальное кол-во мм ( некое число DATA_Y) которое нужно отобразить на табло?
отображаю таким алгоритмом
temp_y1 =16;//INDEX_NEGATIVE_SIGN;
temp_y2 = DATA_Y/1000000%10;//Вывод цифры - "7"
temp_y3 = DATA_Y/100000%10; //Вывод цифры - "6"
temp_y4 = DATA_Y/10000%10; //Вывод цифры - "5"
temp_y5 = DATA_Y/1000%10;//Вывод цифры - "4"
temp_y6 = DATA_Y/100%10; //Вывод цифры - "3"
temp_y7 = DATA_Y/10%10; //Вывод цифры - "2"
temp_y8 = DATA_Y/1%10;//Вывод цифры - "1"


