roboforum.ru

Технический форум по робототехнике.
Текущее время: 17 фев 2025, 09:25

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: 64 бит - 8 байтовая арифметика в AVR. Как ?
СообщениеДобавлено: 26 июн 2007, 14:03 
Не в сети

Зарегистрирован: 03 май 2007, 12:45
Сообщения: 58
Откуда: Аксай(Рост.обл.)
прог. языки: C
есть некая задача:умножить друг на друга два числа(4байтовые),а получившееся получится огромным(8байт).возможно ли такое сделать в кодвижне?как организовать 8байтовую переменную?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 26 июн 2007, 15:58 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
Как вариант - вручную. Тоесть 2 переменные, старшая и младшая.  :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 26 июн 2007, 23:50 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Там наверняка кто-то делал.

http://telesys.ru/wwwboards/mcontrol/index.shtml


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 18:19 
Не в сети

Зарегистрирован: 03 май 2007, 12:45
Сообщения: 58
Откуда: Аксай(Рост.обл.)
прог. языки: C
придется мне долго думать.я там не разгребу.а можно поподробней про по частям?как можно сделать умножение отдельно мл и ст части?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 19:55 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Помню видел гдето в сети библиотеку для чисел до 24 бит.  Пошукай через GOOGLE.com


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 20:10 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вот нашел кое что, наверно можно на Си переложить.

http://www.6502.org/source/

http://www.6502.org/source/integers/32muldiv.htm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 20:31 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
В апноуте есть схемы умножения по половинками 16 на 16  

возможно она применима и для 32 на 32

http://www.atmel.com/dyn/resources/prod ... oc1631.pdf

AVR201 Using the AVR Hardware Multiplier


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 20:36 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вот кейл пример 16 на 16  и тоже как отправная точка

http://www.keil.com/support/docs/2008.htm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 21:33 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
32 бит умножить на 32 бит (все единицы) будет  FF FF FF FE 00 00 00 01

FFFFFFFE00000001  в десятичном виде - 18446744065119617025


18 446 744 065 119 617 025


т.е. вы можете привести ваше 32 битное число к типу float  или double

float 32 ±1.175e-38 to ±3.402e38
double 32 ±1.175e-38 to ±3.402e38

вот так

(float)число

Сделать умножение и результат привести к двум 32 битным числам нужного вам типа

long int                32 -2147483648 to 2147483647
unsigned long int 32 0 to 4294967295
signed long int 32 -2147483648 to 2147483647

Это приведение будет "хитрым"

Старшее 32 битное число - будет результат поделить на 2 в степени 32

А младшее 32 битное наверно будет - результат минус (старшее число умноженое на 2 с теп 32).


Нужно проверить не будет ди проблем с округлениями дробных частей  и сколько времени все это будет занимать.

==============

Пример

если  18446744065119617025  поделить на 2 в 32 степени (4294967296) получим   4294967294,0000000002328306436539


FFFFFFFE   и  остаток    0,0000000002328306436539

это старшее 32 битное число в нужном нам 64 битном.


теперь вычтем  из 18446744065119617025  число 4294967294 умноженое на 2 в степени 32 (4294967296)  получаем число  1
это младшее 32 битное число.


так мы получили  64 битный результат:    FF FF FF FE 00 00 00 01


Последний раз редактировалось avr123.nm.ru 27 июн 2007, 22:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 июн 2007, 21:38 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
64-bit Arithmetic in C++


ftp://ftp.embedded.com/pub/1998/crenshaw98.txt


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 28 июн 2007, 10:07 
Не в сети

Зарегистрирован: 03 май 2007, 12:45
Сообщения: 58
Откуда: Аксай(Рост.обл.)
прог. языки: C
спасибо!буду разбираться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 28 июн 2007, 13:00 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Я считал в калькуляторе Windows в инженерном режиме.

hexelon.com  - мощный бесплатный калькулятор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 28 июн 2007, 14:06 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
avr123.nm.ru писал(а):
hexelon.com  - мощный бесплатный калькулятор.

мне этот больше нравится: http://www.rionnag.com/rionacalc.php
жаль в вине не завелся

кстати этот hexelon в вине запустился, но считать отказывается.
потом врядли он вычислит 1024! :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 28 июн 2007, 14:37 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вот на телесистемах подсказали вариант умножения:

http://telesys.ru/wwwboards/mcontrol/17 ... 3501.shtml


--------------------------------------------------------------------------------


На примере беззнаковых
result=(low1+2^16*high1)(low2+2^16*high2)=
low1*low2+2^16*(low1*high2+low2*high1)+2^32*high1*high2.

Сомножители: unsigned long operand1,operand2;

unsigned long low_result; //low 32 bits of result
unsigned long high_result; //high 32 bits of result;
unsigned long tmp;
unsigned long lop1,lop2;

lop1=operand1&0xffffL;
lop2=operand2&0xffffL;

operand1>>=16;
operand2>>=16;

low_result=lop1*lop2;
tmp=low_result>>16;
high_result=operand1*operand2;

operand1*=lop2;
operand2*=lop1;
lop1=operand1&0xffffL;
operand1>>=16;
lop2=operand2&0xffffL;
operand2>>=16;

tmp+=lop1+lop2;
lop1=tmp<<16;
low_result+=lop1;

tmp>>=16;
high_result+=(tmp+operand1+operand2);

====

Я не разбирался.  :lol:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 01 июл 2007, 17:05 
Не в сети

Зарегистрирован: 03 май 2007, 12:45
Сообщения: 58
Откуда: Аксай(Рост.обл.)
прог. языки: C
спасибо всем за помощь!попробую прилепить этот код к авр.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO