|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.07.2014, 15:14 | #1 |
Пользователь
Регистрация: 25.11.2006
Сообщений: 40
|
замена умножения
Дорый день
подскажите как заменить мне обычное умножение на сложение со сдвигом приблизительный код: int iGr; // принимает целочисленные значения float delt; // имеют значения 0.000000123 такого порядка iGr=delt*1000000; // заменить вот это выражение где 1000000 - константа Спасибо |
14.07.2014, 17:28 | #2 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
С float не получится т.к. это число записывается с мантиссой и порядком. Можно определить тип - unsigned short. Тогда, Ваше число запишется как 0000000001111011 и его можно сдвигать командой _rotr предварительно проверив последний разряд на 1 или 0. Если 0, то просто сдвиг. Если 1-а, то сдвиг и сложение с предыдущим результатом.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
14.07.2014, 17:34 | #3 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Код:
I'm learning to live...
|
|
14.07.2014, 17:49 | #4 |
Пользователь
Регистрация: 25.11.2006
Сообщений: 40
|
|
15.07.2014, 09:41 | #5 |
Пользователь
Регистрация: 25.11.2006
Сообщений: 40
|
|
15.07.2014, 10:52 | #6 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
Вот здесь и здесь, немножко о форматах с плавающей запятой.
Может всё-таки проще начать со сдвига чисел целочисленных форматов?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 15.07.2014 в 11:02. |
15.07.2014, 12:55 | #7 | |
Пользователь
Регистрация: 25.11.2006
Сообщений: 40
|
Цитата:
unsigned __int32 usDelt, usDelt1; usDelt=*((int*) &delt); // тут получил в двоичном виде или хексе usDelt1=usDelt>>13; // сдвигаю в право поскольку delt положительное собственно реализую умножение ???? результат отличается от iGr=(int) (delt*1000000); ЧТО не ТАК !!! |
|
15.07.2014, 13:50 | #8 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Вторая строчка не так. У вас в памяти лежит "знак_мантисса_порядок" (условно), от того что вы сказали считай это все просто целым - исходное не преобразовалось в целое, действия с ним не совпадут с операциям с исходным. Прочитайте ссылки.
|
15.07.2014, 14:21 | #9 |
Пользователь
Регистрация: 25.11.2006
Сообщений: 40
|
меня смущает что в виде двоичного представления смещяю я все и знак и экспоненту и мантиссу,
может есть пример будет проще разобраться |
15.07.2014, 15:50 | #10 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Давайте по простому:
1. Есть флоат число в 8 бит без знака, т.е., например, 5 битов мантисса + 3 порядок = 00001 001 = 1 2. Вы говорите, компилятору - считай все это просто целым числом. Компилятор: ок, теперь это 9 3. Вы говорите, компилятору - сдвинь целое на 1 влево (т.е. фактически умножь на 2). Компилятор: ок, 00010 010 = 18 4. Вы говорите, компилятору - выведи мне вот это, как оно было изначально. Компилятор: ок, 5 битов мантисса + 3 бита порядок... и что выведется? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
таблица умножения | narco3 | Помощь студентам | 2 | 04.10.2011 20:11 |
Таблица умножения | romantik2011 | PHP | 3 | 11.08.2011 19:24 |
Замена умножения сложением со сдвигом - ошибка при компиляции... | Nura | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 9 | 17.02.2011 06:18 |
Замена умножения и деления | Alex Cones | Общие вопросы Delphi | 16 | 05.09.2010 18:00 |
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL | DorianLeroy | Фриланс | 8 | 18.02.2009 18:52 |