|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
Умножение дробных чисел испольуя asm20.12.2013, 11:31. Показов 10748. Ответов 15
Метки нет (Все метки)
Как умножить 2 дробных числа на cortex-m3, с округленным целым результатом?
Например 78,3*45,4 = 3554,8 ~ 3555 Если умножать только целые числа получается большая погрешность.. 78*45=3510 3510/3555~1%. При следующих итерациях эта погрешность накапливается и становится достаточно большой. Как из ситуации выйти?
0
|
|
| 20.12.2013, 11:31 | |
|
Ответы с готовыми решениями:
15
Умножение дробных чисел Умножение дробных чисел в асме AT90S1200. Умножение 4-х разрядных чисел на ASM |
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 222
|
|
| 20.12.2013, 12:28 | |
|
А так нельзя? 783*454=355482
0
|
|
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
||
| 20.12.2013, 14:09 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 20.12.2013, 14:33 | ||
А вообще - почитайте про арифметику с фиксированной точкой. Оно как раз об этом. Действия производятся с числами, смещёнными на фиксированное количество разрядов, и только при выводе на дисплей/UART/файл/etc делается форматирование с восстановлением (визуально) дробной части.
0
|
||
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
| 20.12.2013, 14:36 | |
|
А здесь и стала дилемма. Или делить на 100 или понижать точность. На AVRках я весь алгоритм умножал на 100 и уже конечный результат делил.
0
|
|
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 20.12.2013, 14:38 | ||
Сдвигом вправо, кстати, тоже можно делить, просто не привязывайтесь к десятичной форме представления числа, работайте в двоичной (восьмиричной/шестнадцатиричной, не суть). Тогда быстрые сдвиги будут работать. В десятичный формат переведёте уже только при окончательном выводе результата пользователю, как я писал выше.
0
|
||
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|||
| 20.12.2013, 15:01 | |||
0
|
|||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 20.12.2013, 15:30 | ||
0x0010 - целая единица; 0x0008 - половина от целой единицы = восемь шестнадцатых, то есть 1/2; 0x0011 - целая единица и одна шестнадцатая; 0x0018 - целая единица и восемь шестнадцатых, то есть полтора; С этими числами можно делать любые арифметические действия, как обычно, а для деления использовать сдвиг вправо. Как-то так.
0
|
||
|
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 214
|
|
| 20.12.2013, 17:05 | |
|
Это называются числа с фиксированной запятой.
обычно 16битные делятся на 8бит целое 8бит дробная часть 32битное 16 целое 16 дробное. Операции над ними делают обычными целочисленными командами.
0
|
|
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
||||||
| 20.12.2013, 17:53 | ||||||
|
Я попробовал перемножить два произвольных числа 1973*0,583185... Размерность дробной части брал 16 бит. Получилось вот что:
(вверху результат выданный калькулятором) Это имелось ввиду? т.е. на процессоре мне нужно:
0
|
||||||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 20.12.2013, 20:04 | ||
Для чисел со знаком используйте соответственно знаковые операции (для сложения-вычитания иногда можно обойтись и беззнаковыми). Не забывайте про такой баланс: чем больше бит в дробной части, тем меньше их в целой. Выбор соотношения размеров целой и дробной частей в арифметике с фиксированной точкой (то есть выбор позиции этой самой точки) зависит от потребностей алгоритма. Учитывайте, что знак заберёт один бит от 32-хбитного числа. Если все операции беззнаковые - можно позволить себе чуть бОльшую точность.
0
|
||
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
||
| 20.12.2013, 20:11 | ||
LSL R1, R1, #16 ; Сдвигаем его влево на 16 бит MOV R2, #32219 ; Дробный множитель 32219/65535 = 0,583185 SMULL R3, R4, R1, R2 ; В R4 целый результат, В R3 дробная часть (в старших 16 битах)Обратите внимание на этот пример, он замечателен тем, что у первого операнда сдвиг можно было не делать. В подпрограммах, ответственных за максимальную точность и скорость вычислений, можно вручную "подпилить" такие особенности. А в менее чувствительных кусках кода или в коде, где не известны заранее особенности операндов, придётся забивать в алгоритм какой-то компромисс типа 16+16 бит или 24+8 и т.п.
0
|
||
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
||
| 20.12.2013, 22:10 | ||
LSL R1, R1, #16 ; Сдвигаем его влево на 16 бит MOV R2, #32219 ; Дробный множитель 32219/65535 = 0,583185 SMULL R3, R4, R1, R2 ; В R4 целый результат, В R3 дробная часть (в старших 16 битах)Обратите внимание на этот пример, он замечателен тем, что у первого операнда сдвиг можно было не делать. В подпрограммах, ответственных за максимальную точность и скорость вычислений, можно вручную "подпилить" такие особенности. А в менее чувствительных кусках кода или в коде, где не известны заранее особенности операндов, придётся забивать в алгоритм какой-то компромисс типа 16+16 бит или 24+8 и т.п. Спасибо тебе за подсказки! Я с этим делом впринципе разобрался. Все сводится к тому, что при умножении нужно запятую под запятой размещать - прям как в первом классе учили))) В приведенном коде разрядность дробной части я выбрал 16 только потому, что удобно отсекать целую часть, и точность вычислений до единицы меня устраивает (даже немного точнее получается). И в принципе не должно переполнений возникнуть (разрядность целой части 12 бит - с АЦП).
0
|
||
|
m16
|
||||||||||||||||||||||
| 20.12.2013, 23:10 | ||||||||||||||||||||||
перед вычислениями нужно привести все константы и переменные к одному порядку. и пользуем целочисленку на ура. если результат выводим на дисплей , то запятой приводим результат к ранее принятому порядку. поясню - понадобилось мне посчитать полином :
|
||||||||||||||||||||||
|
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 208
|
||
| 22.12.2013, 15:18 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 222
|
|
| 22.12.2013, 18:53 | |
|
Ещё, до кучи
0
|
|
| 22.12.2013, 18:53 | |
|
Помогаю со студенческими работами здесь
16
Умножение чисел с косвенной адресацией (ASM 51)
Умножение двухбайтного на однобайтный прямой код (ATmega128, ASM)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|