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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Умножение дробных чисел
mse
сообщение May 29 2007, 08:43
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(golovin @ May 29 2007, 12:31) *
В том то и дело, что нужно определить числа кратные 5. А такой метод не даёт точности. Т. е. если R0 = 0 - кратное. А так приходится вводить некую дельту и плясать вокруг неё. А это время.

Никакой проблемы ;О) вам нужна дробная часть. Множите число на 0х3334 и смотрите средний байт, если "0", то таво...
Go to the top of the page
 
+Quote Post
golovin
сообщение May 29 2007, 08:50
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012



А можно поподробней про число 0х3334 ?
Go to the top of the page
 
+Quote Post
mse
сообщение May 29 2007, 08:56
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(golovin @ May 29 2007, 12:50) *
А можно поподробней про число 0х3334 ?

Дык, этта...65536/5+1
Go to the top of the page
 
+Quote Post
golovin
сообщение May 29 2007, 09:44
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012



to mse: БОЛЬШОЕ спасибо
Go to the top of the page
 
+Quote Post
ae_
сообщение May 29 2007, 10:31
Сообщение #20


Участник
***

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



Цитата(mse @ May 29 2007, 17:43) *
Никакой проблемы ;О) вам нужна дробная часть. Множите число на 0х3334 и смотрите средний байт, если "0", то таво...

У меня получилось обойтись одним умножением 8х8
Код
    ldi    R16, 99    ;Число для проверки на кратность 5-ти, 0...255
    ldi    R17, 256/5;Множитель = 1/5 * 256
    mul    R16, R17;Умножаем(делим :)
    ldi    R17, 205;У всех чисел, кратных 5-ти, дробная часть >=205
    cp    R0, R17    ;Сравниваем дробную часть с пороговым значением
    brsh    KRATNO_5;Переход, если число кратно 5-ти
    tst    R16    ;Проверка делимого на ноль
    breq    KRATNO_5;Делимое=0, тоже кратно 5-ти
NE_KRATNO_5:
;...
KRATNO_5:
;...

Для golovin - если не требуется считать 0 кратным 5-ти, то пару строк можно убрать:
tst R16 ;Проверка делимого на ноль
breq KRATNO_5 ;Делимое=0, тоже кратно 5-ти
Go to the top of the page
 
+Quote Post
mse
сообщение May 29 2007, 10:46
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(ae_ @ May 29 2007, 14:31) *
У меня получилось обойтись одним умножением 8х8

Вполне мобуть!
Go to the top of the page
 
+Quote Post
defunct
сообщение May 29 2007, 15:55
Сообщение #22


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Есть такой интересный алгоритм деления на 10:

Для 8-ми битных чисел:

Y = (X * 0xCD) >> 11;

Для 16-ти битных

Y = ( X * 0xCCCD) >> 19;

Для 32-х битных

Y = ( X * 0xCCCCCCCD) >> 35

Если сдвинете на бит меньше - получите деление на 5.
Go to the top of the page
 
+Quote Post
m16
сообщение May 30 2007, 08:56
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 242
Регистрация: 27-01-05
Пользователь №: 2 225



Цитата(defunct @ May 29 2007, 19:55) *
Есть такой интересный алгоритм деления на 10:

добавлю по теме полезный ресурс http://www.cs.uiowa.edu/~jones/bcd/divide.html
Go to the top of the page
 
+Quote Post
golovin
сообщение May 30 2007, 11:07
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012



Спасибо за интересные мысли !
Go to the top of the page
 
+Quote Post
umup
сообщение Jun 1 2007, 02:17
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



Вот, может подойдет - для 8 и 16 битных чисел. Первый вариант функции для контроллеров без умножителя, второй - с умножителем.

Код
/** \brief unsigned 8-bit division by 5 (using shifts)<br>деление беззнакового 8-битного числа на 5 (если нет аппаратного умножения) \ingroup group_math */
u8 div_by5_u8_soft(u8 data_in)
{u16 u16_01, result;
result = u16_01 = data_in;
u16_01 <<= 1; result += u16_01;
u16_01 <<= 3; result += u16_01;
u16_01 <<= 1; result += u16_01;
result += 0x33; //correction
return(result >> 8);
}

/** \brief unsigned 8-bit division by 5 (using multiply)<br>деление беззнакового 8-битного числа на 5 (если есть аппаратное умножение) \ingroup group_math */
u8 div_by5_u8_hmul(u8 data_in)
{return((((u16)data_in * 0x33) + 0x33) >> 8);
}

/** \brief unsigned 16-bit division by 5 (using shifts)<br>деление беззнакового 16-битного числа на 5 (если нет аппаратного умножения) \ingroup group_math */
u16 div_by5_u16_soft(u16 data_in)
{u32 u32_01, result;
result = u32_01 = data_in;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
result += 0x3333; //correction
return(result >> 16);
}

/** \brief unsigned 16-bit division by 5 (using multiply)<br>деление беззнакового 16-битного числа на 5 (если есть аппаратное умножение) \ingroup group_math */
u16 div_by5_u16_hmul(u16 data_in)
{return((((u32)data_in * 0x3333) + 0x3333) >> 16);
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:11
Рейтинг@Mail.ru


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