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

 
 
> IAR C умножение int x int = long, Странность компилятора, или я что-то не допонимаю
Д_М
сообщение Jun 22 2013, 21:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Здравствуйте!
Перенёс код алгоритма, отлизанный при помощи C Builder, на IAR - не работает. После долгих поисков выявил, что когда умножаются два числа int, а частное long, старшие 16 бит частного всегда равны нулю. Когда сделал множителе тоже long всё нормально. Как-то странно. Другие компиляторы наоборот выдают придупреждения, когда разрядность частного не больше, чем разрядность множителей - char/int, или int/long...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mmor
сообщение Dec 9 2013, 13:14
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-04-06
Пользователь №: 16 379



Раз уж про умножение задам сюда же вопрос.
микроконтроллер AT90USB128. Среда программирования JAR 4.10. Язык С++.
есть необходимость помножить целое чесло на число с точкой. Задаю тип переменной double - компилятор комплирует программу, и даже результат умножения близок к истинному. Вот только сомнения меня гложут можно ли такую программу в контроллер зашивать? будет ли работать.
Поэтому все переменные оставил int, но умножаю на число с точкой.
Например:B = A*0.8;
Пусть A = 25000
Тогда B получается 20000.
Т. е. вычисляется вполне точно.
Стал смотреть дизасемблер, а там какой то сложный итеративный процесс идет.
Может кто нибудь на словах объяснить что контроллер делает при умножении на число с точкой?

Ну и еще вопрос по умножению целого на целое.
скажем 0A0Bh x 000Ch = 7884h.
При этом дизасемблер показывает, что умножение происходит по такому алгоритму:

(00x0B)+(0Cx0A) - это младший байт
(0Сx0B) - старший байт результата умножения.

Может кто объяснить откуда такой алгоритм взялся?

Сообщение отредактировал mmor - Dec 9 2013, 13:20
Go to the top of the page
 
+Quote Post
Xenia
сообщение Dec 9 2013, 13:37
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(mmor @ Dec 9 2013, 17:14) *
микроконтроллер AT90USB128. Среда программирования JAR 4.10. Язык С++.
есть необходимость помножить целое чесло на число с точкой. Задаю тип переменной double - компилятор комплирует программу, и даже результат умножения близок к истинному. Вот только сомнения меня гложут можно ли такую программу в контроллер зашивать? будет ли работать.
...
Стал смотреть дизасемблер, а там какой то сложный итеративный процесс идет.
Может кто нибудь на словах объяснить что контроллер делает при умножении на число с точкой?


У микроконтроллера AT90USB128 (как впрочем и у остальных МК с архитектурой AVR) отсутствует аппаратное умножение с плавающей точкой, а потому такие операции производятся библиотекой эмуляции. Очень медленно и кода тоже много.

Для большинства дел, связанных со шкалированием (умножения целых чисел на постоянный нецелый коэффициент) бывает достаточно заменить float-множитель на целочисленную дробь. Например, вместо умножения на 0.8 умножать на 4, потом делить на 5.

Но если медленное умножение вас не тяготит, то можете смело довериться компилятору - тут он не ошибется, т.к. не сам сочиняет алгоритм, а пользуется библиотечным, который давным давно отлажен.
Go to the top of the page
 
+Quote Post



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

 


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


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