Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2014, 15:14   #1
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию замена умножения

Дорый день
подскажите как заменить мне обычное умножение на сложение со сдвигом

приблизительный код:
int iGr; // принимает целочисленные значения
float delt; // имеют значения 0.000000123 такого порядка

iGr=delt*1000000; // заменить вот это выражение где 1000000 - константа

Спасибо
AlexVI вне форума Ответить с цитированием
Старый 14.07.2014, 17:28   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

С float не получится т.к. это число записывается с мантиссой и порядком. Можно определить тип - unsigned short. Тогда, Ваше число запишется как 0000000001111011 и его можно сдвигать командой _rotr предварительно проверив последний разряд на 1 или 0. Если 0, то просто сдвиг. Если 1-а, то сдвиг и сложение с предыдущим результатом.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.07.2014, 17:34   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
С float не получится
Я полагаю что речь идет о чем-то вроде этого:
Код:
iGr=(int)delt<<10+10;
Но нужно подобрать подходящее для сдвига число.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 17:49   #4
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я полагаю что речь идет о чем-то вроде этого:
Код:
iGr=(int)delt<<10+10;
Но нужно подобрать подходящее для сдвига число.
вроде один сдвиг это умножение на 2 ?
подходящее число определить опытым путем ?
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 09:41   #5
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я полагаю что речь идет о чем-то вроде этого:
Код:
iGr=(int)delt<<10+10;
Но нужно подобрать подходящее для сдвига число.
что то пробую ничего кроме 0 не выходит
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 10:52   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вот здесь и здесь, немножко о форматах с плавающей запятой.
Может всё-таки проще начать со сдвига чисел целочисленных форматов?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 15.07.2014 в 11:02.
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.07.2014, 12:55   #7
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Вот здесь и здесь, немножко о форматах с плавающей запятой.
Может всё-таки проще начать со сдвига чисел целочисленных форматов?
записываю так
unsigned __int32 usDelt, usDelt1;
usDelt=*((int*) &delt); // тут получил в двоичном виде или хексе
usDelt1=usDelt>>13; // сдвигаю в право поскольку delt положительное собственно реализую умножение ????

результат отличается от iGr=(int) (delt*1000000); ЧТО не ТАК !!!
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 13:50   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вторая строчка не так. У вас в памяти лежит "знак_мантисса_порядок" (условно), от того что вы сказали считай это все просто целым - исходное не преобразовалось в целое, действия с ним не совпадут с операциям с исходным. Прочитайте ссылки.
p51x вне форума Ответить с цитированием
Старый 15.07.2014, 14:21   #9
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

меня смущает что в виде двоичного представления смещяю я все и знак и экспоненту и мантиссу,
может есть пример будет проще разобраться
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 15:50   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Давайте по простому:
1. Есть флоат число в 8 бит без знака, т.е., например, 5 битов мантисса + 3 порядок = 00001 001 = 1
2. Вы говорите, компилятору - считай все это просто целым числом. Компилятор: ок, теперь это 9
3. Вы говорите, компилятору - сдвинь целое на 1 влево (т.е. фактически умножь на 2). Компилятор: ок, 00010 010 = 18
4. Вы говорите, компилятору - выведи мне вот это, как оно было изначально. Компилятор: ок, 5 битов мантисса + 3 бита порядок... и что выведется?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
таблица умножения 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