реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Вычисления на ATmega88
xemul
сообщение Dec 13 2008, 22:41
Сообщение #31



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(singlskv @ Dec 14 2008, 00:33) *
на самом деле рассчет коррекции проще всего делать так:
...

Вы абсолютно правы - я забыл про исходную постановку задачи и плавно на простое округление.
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Dec 13 2008, 23:35
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата(singlskv @ Dec 13 2008, 23:33) *
-итого: 50<= A < 53
то есть нам подойдут 50, 51, 52

выбор чисел 0, 9, 10, 250, 255 надеюсь понятен


Действительно, простой расчет smile.gif.
Но A = [50..52] (как и приведенная мной формула, где А=51)- это для случая деления с отбрасыванием дробной части, т.е для выражения X div 10.

Для деления с округлением, воспользовавшись Вашей методикой, получаем
1.) 0 * 51 +A >= 0
2.) 4 * 51 +A < 1 * 512
3.) 5 * 51 + A >= 1 * 512
4.)254 * 51 + A < 26 * 512
5.)255 * 51 + A >= 26 * 512
- преобразуем
1.) A >= 0
2.) A < 308
3.) A >= 257
4.) A <358
5.) A >= 307

Откуда A = 307.

P.S. Существуют ли алгоритмы для быстрого получения остатка от деления на 10, 100 (кроме варианта X - (X div 10)*10 )?

Цитата
Вместо
((x*51) + 51/2) >> 9 ~= ((x*51)+26)>>9
читать
((x*51) + 1<<8) >> 9 = (x*51)>>9 + 0.5

Здесь A = 1<<8 = 512. При x=11 получаем в результате 2.
Go to the top of the page
 
+Quote Post
ae_
сообщение Dec 14 2008, 11:51
Сообщение #33


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Так, что бы во всём диапазоне 0...255 / 10 выполнялось с округлением правильно:
Код
0....4 / 10 = 0
5...14 / 10 = 1
15...24 / 10 = 2
25...34 / 10 = 3
35...44 / 10 = 4
45...54 / 10 = 5
55...64 / 10 = 6
65...74 / 10 = 7
75...84 / 10 = 8
85...94 / 10 = 9
95..104 / 10 = 10
105..114 / 10 = 11
115..124 / 10 = 12
125..134 / 10 = 13
135..144 / 10 = 14
145..154 / 10 = 15
155..164 / 10 = 16
165..174 / 10 = 17
175..184 / 10 = 18
185..194 / 10 = 19
195..204 / 10 = 20
205..214 / 10 = 21
215..224 / 10 = 22
225..234 / 10 = 23
235..244 / 10 = 24
245..254 / 10 = 25
     255 / 10 = 26

У меня получилось только с множителем >= 205 по формуле (1+(x*205)>>10)>>1

Тоже самое на асме:
Код
     ldi R16, 205
     mul DATA, R16
     lsr R1
     lsr R1
     inc R1
     lsr R1
     mov DATA, R1
Go to the top of the page
 
+Quote Post
koluna
сообщение Dec 15 2008, 09:59
Сообщение #34


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Кстати, а что за метод в 11 посте?
Там логика другая...

Кстати, для делимого, находящегося в диапазоне unsigned long деление на 255 как будет выглядеть?


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 15 2008, 11:33
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(n_bogoyavlensky @ Dec 15 2008, 15:59) *
Кстати, а что за метод в 11 посте?
Там логика другая...

Там используют известное разложение в ряд 1/(1+x) ~ 1-x для x много меньше 1.
Получается
a/(256-1) = a/256 * 1/(1-1/256) ~ a/256 * (1 + 1/256) = (a + a/256)/256,
а 128 там прибавляют для правильного округления до ближайшего целого.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th August 2025 - 09:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016