Страница 1 из 2
Приведение 32 бит к 16
Добавлено: Вт авг 05, 2008 09:57:41
Rubin
Добрый день Уважаемые форумчане. Столкнулся с задачкой: перемножаю 2 16 бит числа, соответственно получаю число 32 бит. Это 32 бит число необходимо привести обратно к 16. ror желаемого результата не дает.
Re: Приведение 32 бит к 16
Добавлено: Вт авг 05, 2008 11:22:24
ArtemKuchin
Rubin писал(а):Добрый день Уважаемые форумчане. Столкнулся с задачкой: перемножаю 2 16 бит числа, соответственно получаю число 32 бит. Это 32 бит число необходимо привести обратно к 16. ror желаемого результата не дает.
Ну а если просто отрезать нижние 16 бит? Останутся верхние 16 значащих бит. Или взять нижние, смотря что надо.
Ведь понятно. что 0x12345678 не может быть однозначно переведено
в 16 битноую форму.
Поэтому, если нужно точность до 16 бит, то просто берем
0x1234 и имеет ввиду что это изанчальное число деленное на 65536 0xffff
А если мы знаем, что при перемножении результат не может быть больше 0xffff то смело берем нижние 16 бит (0x5678)
А о каком языке речь идет?
Добавлено: Вт авг 05, 2008 11:27:37
Rubin
пробовал, лажа получается, и умножать старшие части тоже пробовал, разброс в 10 процентов, и это до моей значащей запятой (целая часть)

Добавлено: Вт авг 05, 2008 11:42:04
ARV
гм... интересно, а вы как хотели? привести 32 бита к 16 и при этом точность не потерять?! запросы непомерные у вас, батенька!

Добавлено: Вт авг 05, 2008 12:04:16
Rubin
вопрос о точности не стоит, значащих будет 5 цифр (111,11).
Добавлено: Вт авг 05, 2008 12:06:40
ARV
а тогда о чем стоит? из 32-разрядного результата вы берете старшее слово, т.е. результат делите на 65535. и надеетесь получить более-менее приличный результат?
Добавлено: Вт авг 05, 2008 12:12:24
ArtemKuchin
Rubin писал(а):вопрос о точности не стоит, значащих будет 5 цифр (111,11).
5 цифр в десятичной системе это максиум 99999 ЧТО ЗА ПРЕДЕЛАМИ 16 бит! (16 бит без знака это макс 65535). Это 17 бит!
Какое у вас максимальное число в измерениях?
Если точно за пределами 65535,то варианты:
1) Разделить все на 2 (т.е. сдвинуть вправо на 1бит), потеряется точность, но все влезет в 16 бит.
2) Взять нижние 16 бит, а 17-й обрабатывать отдельно в условных переходах, так как он всего один лишний бит, то можно его и обработать в if отдельно
3) сдвинуть все вправо, но запомнить младший бит, обработать все как 16-и битовое число и учесть потом младиший бит хитрым алгоритмом
Добавлено: Вт авг 05, 2008 12:14:08
Rubin
до 300
Добавлено: Вт авг 05, 2008 12:18:37
ArtemKuchin
Rubin писал(а):до 300
Прошу перечитать мое предыдущее сообщени - я его подредактировал.
Эм. видать не тот вопрос задал. Какое максимаьлно число может быть как разультат этого перемножения?
Добавлено: Вт авг 05, 2008 13:13:39
Rubin
результатом перемножения может быть максимальное число - 654080625
Дело в том что нужно результат умножения перевести в BCD, ну а запятую поставить - дело техники. в BCD числа переводятся в 16 формате, поэтому и надо придти к 16 формату чтобы обработать в BCD
Добавлено: Вт авг 05, 2008 13:44:14
ARV
фигню какую-то вы тут нам говорите... при чем тут BCD? если надо - переводите свое 32-разрядное в BCD... хотя зачем это может вам понадобиться - ума не приложу...
Добавлено: Вт авг 05, 2008 14:14:21
Rubin
результаты измерений ацп перемножаются, на одном канале меряю напряжение на другом ток, перемножаю, плучаю мощность
Добавлено: Вт авг 05, 2008 14:24:31
ArtemKuchin
Rubin писал(а):результаты измерений ацп перемножаются, на одном канале меряю напряжение на другом ток, перемножаю, плучаю мощность
Все, вариантов нет, или режем нижние 16 бит и получаем малую точность
или не режем и работаем со всеми 32-я как можем.
Как вариант можно с АЦП снимать старшие 8 бит и их перемножать получая сразу 16 бит.
Добавлено: Вт авг 05, 2008 14:30:32
Пухич
Как вариант можно с АЦП снимать старшие 8 бит и их перемножать получая сразу 16 бит.
Правда при этом надо помнить, что результат окажется в 4*4 раз меньше.
Добавлено: Вт авг 05, 2008 14:37:10
ARV
используйте float...
Добавлено: Вт авг 05, 2008 14:44:41
Rubin
float не подходит потому что пишу на асме, а забирать результат в 8 бит тоже не вариант, у меня 25 раз складываются результаты измерения (чтобы не делить на 4, при внутреннем ИОН)
Добавлено: Вт авг 05, 2008 14:53:55
ArtemKuchin
Rubin писал(а):float не подходит потому что пишу на асме, а забирать результат в 8 бит тоже не вариант, у меня 25 раз складываются результаты измерения (чтобы не делить на 4, при внутреннем ИОН)
Ну все.
Нельзя конвертнуть 32 бита в 16 бит и не потерять точность. если число в 16 бит не помещаются. Это невозможно. Это тоже самое. что слона запихнуть в кухонный шкаф.
Поэтому выбор: или отказываться от такой точности или работать с 32-я битами.
Вопрос думаю закрыт.
Добавлено: Вт авг 05, 2008 14:59:53
nds
Переводите данные с ацп в BCD c фиксированной точкой
а потом умножайте BCD числа
умножение столбиком не забыли еще?:)
Добавлено: Вт авг 05, 2008 15:02:56
ArtemKuchin
nds писал(а):Переводите данные с ацп в BCD c фиксированной точкой
а потом умножайте BCD числа
умножение столбиком не забыли еще?:)
пардон, а это тут причем? Зачем BCD? Солько бит займет число
1000000 в BCD? 32 бита! У него же не с перемноженем проблема, а вообще. непонятно счем. По сути, не хочет человек работать с 32-битным числом и все тут.
Добавлено: Вт авг 05, 2008 15:05:34
nds
Цитирую:
"Дело в том что нужно результат умножения перевести в BCD, ну а запятую поставить - дело техники. в BCD числа переводятся в 16 формате, поэтому и надо придти к 16"
"вопрос о точности не стоит, значащих будет 5 цифр (111,11)."
Навсякий случай уточню если делать вычисления в бцд (поразорядно) разрядность используемых переменных не превысит 8 бит а соответственно и 16