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

 
 
> Умножение 32 на code vision, проблема
Botadeus
сообщение May 3 2007, 14:22
Сообщение #1





Группа: Новичок
Сообщений: 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, тоесть по идеи всё правильно, только вот результат куда то девается либо вообще не знаю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
KRS
сообщение May 3 2007, 14:38
Сообщение #2


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

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



По стандарту С у вас будет умножаться 16 бит на 16 и результат будет 16.
Надо пистаь так

temp = (long)f[v]* (long)CAS[v][t];
Go to the top of the page
 
+Quote Post
Botadeus
сообщение May 3 2007, 14:53
Сообщение #3





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



Большое спасибо, умножатся начало. smile.gif
Go to the top of the page
 
+Quote Post
WHALE
сообщение May 3 2007, 16:36
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



и компилятор должен был выдать варнинг о потере точности,вообще-то.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Botadeus
сообщение May 3 2007, 20:29
Сообщение #5





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



варнинг один раз проскачил, о том что возможно переполнение при умножении 16 на 16, но он же не сказал что результат тоже 16 будет. , вообщем считает, но ошибается ( не в этом расчете) а вообще вцелом, может переполнение, хотя я косинусы забил вручную он от -32000 до + 32000
как смотреть переполнение? асемблеровскую вставку? или так можно?
Go to the top of the page
 
+Quote Post
KRS
сообщение May 3 2007, 20:47
Сообщение #6


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

Группа: Модераторы
Сообщений: 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 бита
Go to the top of the page
 
+Quote Post
Botadeus
сообщение May 6 2007, 07:32
Сообщение #7





Группа: Новичок
Сообщений: 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
Код который получился на асемблере
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 6 2007, 18:03
Сообщение #8


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Botadeus @ May 6 2007, 09:32) *
Время очень сильно возрасло, не делает ли он теперь 32 на 32?

Обязательно, ведь теперь переменные приведены к 32 битам.
Читайте описание С.
Единственный способ - написать на асме свою функцию int32_t mul16_16(int16_t, int16_t);


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение May 6 2007, 18:55
Сообщение #9





Guests






А вот она, например:

Код
;--------------------------------------------------------------------
; Unsigned 16x16=32 multiply, r9:r8:r7:r6 = r4:r3 * r17:r16
; 14 program words, 17 clocks + ret
mulu16x16:
        clr     r2

        mul     r4,r17
        movw    r8,r0
        mul     r3,r16
        movw    r6,r0
        mul     r4,r16
        add     r7,r0
        adc     r8,r1
        adc     r9,r2
        mul     r3,r17
        add     r7,r0
        adc     r8,r1
        adc     r9,r2

        ret
;--------------------------------------------------------------------


Сообщение отредактировал =AVR= - May 6 2007, 18:57
Go to the top of the page
 
+Quote Post
Botadeus
сообщение May 7 2007, 17:49
Сообщение #10





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



Спасибо всем smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 12:51
Рейтинг@Mail.ru


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