|
Умножение 32 на code vision, проблема |
|
|
|
May 3 2007, 14:22
|
Группа: Новичок
Сообщений: 5
Регистрация: 22-04-07
Пользователь №: 27 233

|
необходимо осуществить 32 разрядное умножение, переменную создаю типа long, пишу на си что то типа long temp; int f[64]; flash int CAS[64][18]; // zabiti vse znacheniya vruchnuu - konstanta temp = f[v]*CAS[v][t];
вообщем результат этой операции неверный, (распечатываю printf()) если даже что-то с распечаткой, то результат вычисления с огромной ошибкой, написал тоже на билдере всё нормально считается. прогу писал для mega 128 смотрел код который генерируется на асемблере, при вызове 3 раза вызов mul, тоесть по идеи всё правильно, только вот результат куда то девается либо вообще не знаю.
|
|
|
|
|
 |
Ответов
|
May 3 2007, 20:47
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(WHALE @ May 3 2007, 17:36)  и компилятор должен был выдать варнинг о потере точности,вообще-то. Нет в данном случае как раз не должен! Цитата(Botadeus @ May 3 2007, 21:29)  варнинг один раз проскачил, о том что возможно переполнение при умножении 16 на 16, но он же не сказал что результат тоже 16 будет. , вообщем считает, но ошибается ( не в этом расчете) а вообще вцелом, может переполнение, хотя я косинусы забил вручную он от -32000 до + 32000 как смотреть переполнение? асемблеровскую вставку? или так можно? переполнение в данном случае не посмотреть, потому что умножение получается набором команд. у АВР есть только команда 8бит*8бит = 16бит никаких переполнений быть не может. Вам надо просто привести операнды к long - тогда компилятор поймет что вам нужен результат 32 бита. Или написать на асме свою функцию умножения 16 бит * 16 бит = 32 бита
|
|
|
|
|
May 6 2007, 07:32
|
Группа: Новичок
Сообщений: 5
Регистрация: 22-04-07
Пользователь №: 27 233

|
Время очень сильно возрасло, не делает ли он теперь 32 на 32? __MULD12U: MUL R23,R26 MOV R23,R0 MUL R22,R27 ADD R23,R0 MUL R31,R24 ADD R23,R0 MUL R30,R25 ADD R23,R0 MUL R22,R26 MOV R22,R0 ADD R23,R1 MUL R31,R27 ADD R22,R0 ADC R23,R1 MUL R30,R24 ADD R22,R0 ADC R23,R1 CLR R24 MUL R31,R26 MOV R31,R0 ADD R22,R1 ADC R23,R24 MUL R30,R27 ADD R31,R0 ADC R22,R1 ADC R23,R24 MUL R30,R26 MOV R30,R0 ADD R31,R1 ADC R22,R24 ADC R23,R24 RET Код который получился на асемблере
|
|
|
|
Сообщений в этой теме
Botadeus Умножение 32 на code vision May 3 2007, 14:22 KRS По стандарту С у вас будет умножаться 16 бит на 16... May 3 2007, 14:38 Botadeus Большое спасибо, умножатся начало. May 3 2007, 14:53 Botadeus варнинг один раз проскачил, о том что возможно пер... May 3 2007, 20:29   ReAl Цитата(Botadeus @ May 6 2007, 09:32) Врем... May 6 2007, 18:03 =AVR= А вот она, например:
Код;------------------------... May 6 2007, 18:55 Botadeus Спасибо всем May 7 2007, 17:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|