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

 
 
> Деление на дробь на ассемблере, Поделить число на коэффициент с плавающей запятой
Slavast
сообщение Dec 14 2010, 05:43
Сообщение #1


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

Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395



Столкнулся с математической проблемой. Необходимо полученное значение на АЦП поделить на 17.2, чтобы получить реальное входное напряжение.
Но не знаю как разделить число на ассемблере, да еще и на дробное.
Помогите с алгоритмом!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Dec 14 2010, 09:45
Сообщение #2


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

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Slavast @ Dec 14 2010, 09:43) *
Столкнулся с математической проблемой. Необходимо полученное значение на АЦП поделить на 17.2, чтобы получить реальное входное напряжение.
Но не знаю как разделить число на ассемблере, да еще и на дробное.
Помогите с алгоритмом!


Как подсказали перейдите от деления к умножению
Надо разделить на 17,2. Попытаемся представить это число в виде 65536/x
17,2 = 65536/x
x = 65536/17.2 = 3810
Теперь если взять любое входное значение, умножить на 3810 а потом отбросить два старших байта (что эквивалентно сдвигу на 16 вправо или делению на 65536) то получите то что Вам нужно. Не обзязательно брать 65536, можно любое число степень двойки (чем больше число тем выше точность). Суть метода в том чтобы уйти от операции деления к операции умножения с последующим сдвигом результата вправо. Умножение для любого процессора также как и сдвиг довольно простые и быстрые операции. Особенно если писать на ассемблере.

Сообщение отредактировал mempfis_ - Dec 14 2010, 09:53
Go to the top of the page
 
+Quote Post
ae_
сообщение Dec 14 2010, 11:06
Сообщение #3


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(mempfis_ @ Dec 14 2010, 17:45) *
Как подсказали перейдите от деления к умножению
Надо разделить на 17,2. Попытаемся представить это число в виде 65536/x
17,2 = 65536/x
x = 65536/17.2 = 3810
...умножить на 3810 а потом отбросить два старших байта...

отбросить два младших байта... получим целое число в диапазоне 0...59, это из входного диапазона АЦП 0...1023.
[telepat mode] предположу, что ТС нужно получить результат с дробной частью, типа 0...1023 -> 0...59.47 [/telepat mode]
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 14 2010, 11:33
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Если нужна дробная часть, то надо не отбрасывать два младших байта, а преобразовать их в десятичный вид и приписать к целой части.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Dec 15 2010, 05:24
Сообщение #5


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

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Цитата(=GM= @ Dec 14 2010, 17:33) *
Если нужна дробная часть, то надо не отбрасывать два младших байта, а преобразовать их в десятичный вид и приписать к целой части.

Не уверен, что сработает такой подход. А вот домножив коэффициент на 10^k, где k требуемое число знаков после запятой

На примере, приведённом mempfis_
17,2 = 65536/x
x = 65536/17.2 = 3810
Для получения 3-х знаков после запятой
X = x * 1000 = 3810000

Теперь в цифрах, что получается. Например, число 12345
С помощью обычного деления
12345 / 17.2 = 717.7325581
С помощью умножения на коэффициент
12345 * X = 12345 * 3810000 = 47034450000 = 0xAF378C050
Отбрасываем 2 младших байта 0xAF378C050 >> 16 = 0xAF378 = 717688
Получили число 717688 три младших разряда которого в десятичном представлении есть разряды после запятой, т.е. 717.688
Погрешность получается 0.006%
Go to the top of the page
 
+Quote Post
zombi
сообщение Dec 15 2010, 12:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Sergey_Aleksandrovi4 @ Dec 15 2010, 11:24) *
На примере, приведённом mempfis_
17,2 = 65536/x
x = 65536/17.2 = 3810
Для получения 3-х знаков после запятой
X = x * 1000 = 3810000


Мне кажется что умножать на 1000 нужно не округленное X а округлять до целого после умножения:
X = 65536/17.2*1000 = 3810233
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Slavast   Деление на дробь на ассемблере   Dec 14 2010, 05:43
- - kovigor   Цитата(Slavast @ Dec 14 2010, 09:43) Помо...   Dec 14 2010, 06:08
|- - V_G   Если имеется в виду деление на константу, до делит...   Dec 14 2010, 06:23
- - МП41   Цитата(Slavast @ Dec 14 2010, 07:43) Стол...   Dec 14 2010, 06:45
|- - V_G   Цитата(МП41 @ Dec 14 2010, 16:45) А как н...   Dec 14 2010, 08:46
||- - _Pasha   Цитата(Sergey_Aleksandrovi4 @ Dec 15 2010, 12...   Dec 15 2010, 06:07
|||- - Slavast   Цитата(_Pasha @ Dec 15 2010, 12:07) Это ...   Dec 15 2010, 08:44
|||- - ae_   Цитата(Slavast @ Dec 15 2010, 19:44) ...С...   Dec 15 2010, 12:21
||- - Sergey_Aleksandrovi4   Цитата(zombi @ Dec 15 2010, 18:51) Мне ка...   Dec 15 2010, 17:49
|- - mempfis_   Цитата(ae_ @ Dec 14 2010, 15:06) отбросит...   Dec 14 2010, 11:49
- - 777777   Ёжики плакали, кололись, но продолжали писать на а...   Dec 16 2010, 04:48
|- - Slavast   Цитата(777777 @ Dec 16 2010, 10:48) Ёжики...   Dec 17 2010, 06:33
|- - kovigor   Цитата(Slavast @ Dec 17 2010, 12:33) Ребя...   Dec 17 2010, 06:37
|- - 777777   Цитата(Slavast @ Dec 17 2010, 12:33) Ребя...   Dec 17 2010, 10:33
- - Slavast   Всем добрый день! Уже 3-й день не могу перевес...   Dec 24 2010, 04:05
|- - Diusha   Цитата(Slavast @ Dec 24 2010, 10:05) Поде...   Dec 24 2010, 04:17
||- - Slavast   Цитата(Diusha @ Dec 24 2010, 10:17) Могу ...   Dec 24 2010, 04:29
||- - Diusha   Цитата(Slavast @ Dec 24 2010, 10:29) Може...   Dec 25 2010, 06:42
|- - Tanya   Цитата(Slavast @ Dec 24 2010, 10:05) Всем...   Dec 24 2010, 07:04
|- - Slavast   Цитата(Tanya @ Dec 24 2010, 13:04) А если...   Dec 24 2010, 07:56
|- - rezident   Цитата(Slavast @ Dec 24 2010, 15:56) И ка...   Dec 24 2010, 08:18
|- - Tanya   Цитата(Slavast @ Dec 24 2010, 13:56) И ка...   Dec 24 2010, 08:20
- - sergeeff   Что-то мне сдается, что автор ветки не хочет совет...   Dec 24 2010, 10:46
|- - ILYAUL   Цитата(sergeeff @ Dec 24 2010, 16:46) Что...   Dec 24 2010, 12:09
- - sergeeff   Чем две недели заси...ть себе и другим мозги, про...   Dec 24 2010, 15:44
- - andrewkrot   Есть такая книга - Гуртовцев, Гудыменко "Прог...   Dec 25 2010, 13:42
- - kovigor   Цитата(andrewkrot @ Dec 25 2010, 20:42) Е...   Dec 25 2010, 14:42


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:55
Рейтинг@Mail.ru


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