Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарный сдвиг, Как сделать бинарный сдвиг для веществен 
:(
    Опции темы
Lycifer
Дата 25.1.2008, 10:48 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Как сделать бинарный сдвиг для вещественных чисел?(если можно то лучше все бинарные операции для вещественных чисел)
PM MAIL ICQ   Вверх
archimed7592
Дата 25.1.2008, 11:03 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



А в чём великий сакральный смысл сиего действа? Ну, можно так:
Код

float f = 123.45;
usigned int *p = reinterpret_cast< usigned int * >(&f);
... = *p << 3;
но никаких гарантий, что это будет работать везде нет.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
mrbrooks
Дата 25.1.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Lycifer Обычно операции сдвига совершают с целыми числами. Скажем биты упаковать в байты, байты в слова и т.д. Либо для быстрого деления или умножения. Но нафига с вещественными - я есть не понимать. Скажи хоть зачем?
PM MAIL   Вверх
Lycifer
Дата 25.1.2008, 13:30 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Просто интересно, ну вопервых скорость при делении увеличится

Добавлено через 1 минуту и 2 секунды
Да и к стати деление на три сдвигом не сделать?
(умножение понятно, да и то только спроверкой)
PM MAIL ICQ   Вверх
JackYF
Дата 25.1.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Lycifer @  25.1.2008,  12:30 Найти цитируемый пост)
Просто интересно, ну вопервых скорость при делении увеличится

да? а ничего, а что число при этом не поделится на 2, а станет вообще хз каким? в курсе про формат представления чисел с плавающей точкой в компьютере?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
warmonger_
Дата 25.1.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.7.2007
Где: г. Киев

Репутация: 1
Всего: 3



Цитата(Lycifer @  25.1.2008,  13:30 Найти цитируемый пост)
ну вопервых скорость при делении увеличится

не всегда. компилятор может оптимизировать. smile

Добавлено @ 19:25
я имею ввиду обычное деление может оптимизировать

Это сообщение отредактировал(а) warmonger_ - 25.1.2008, 19:25
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
i_SweP
Дата 25.1.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Цитата(Lycifer @  25.1.2008,  13:30 Найти цитируемый пост)
Да и к стати деление на три сдвигом не сделать?

хе, как ты через степени двойки собираешься делить на 3 ? smile

Это сообщение отредактировал(а) i_SweP - 25.1.2008, 19:51
PM MAIL   Вверх
Mayk
Дата 26.1.2008, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(warmonger_ @  25.1.2008,  23:23 Найти цитируемый пост)

не всегда. компилятор может оптимизировать. smile

Добавлено @ 23:25
я имею ввиду обычное деление может оптимизировать

может. правда gcc413 и bcc511 делают это не через игры с битами, а через умножение:

Цитата(bcc32 -6 -O2 -S b.cpp)

Код

   ;    
   ;    double x(double z){
   ;    
@1:
    push      ebp
    mov       ebp,esp
   ;    
   ;        return z/3.0;
   ;    
    fld       tbyte ptr [@2]
    fmul      qword ptr [ebp+8]
   ;    
   ;    }
   ;  



Цитата(gcc -O6 -S -ffast-math b.cpp)

Код

.globl _Z1xd
    .type   _Z1xd, @function
_Z1xd:
.LFB2:
    mulsd   .LC0(%rip), %xmm0
    ret




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 26.1.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Mayk @  26.1.2008,  08:47 Найти цитируемый пост)
может. правда gcc413 и bcc511 делают это не через игры с битами, а через умножение:

по поводу эмуляции вещественной арифметики см. math-emu в ядре Linux


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
W4FhLF
Дата 26.1.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



А по поводу замены деления умножением и сдвигом Software Optimization Guide for AMD Family 10h Processors ;)


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ln78
Дата 26.1.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Lycifer, 
может быть что-то подобное
Код


struct sDouble
{
   unsigned long fraction2;
   unsigned long fraction1 : 20;
   unsigned long exponent  : 11;
   unsigned long signum    :  1;
};

union uDouble
{
   double d;
   sDouble sd;
};

class ShiftDouble
{
public:
   ShiftDouble(const double & d)
   {
      m_d.d = d;
   }
   inline double operator()()
   {
      return m_d.d;
   }
   inline ShiftDouble&  operator<<(const int iS)
   {
// Может быть и контроль на выход за пределы, а может, в предположении корректности входных данных для быстродействия - опущен
      m_d.sd.exponent += iS;
      return *this;
   }
   inline ShiftDouble&  operator<<=(const int iS)
   {
      m_d.sd.exponent += iS;
      return *this;
   }
   inline ShiftDouble&  operator>>(const int iS)
   {
      m_d.sd.exponent -= iS;
      return *this;
   }
   inline ShiftDouble&  operator>>=(const int iS)
   {
      m_d.sd.exponent -= iS;
      return *this;
   }
   uDouble m_d;
};

int _tmain(int argc, _TCHAR* argv[])
{

   ShiftDouble sd1(2.5);
   sd1 = sd1 << 1;
   sd1 >>= 2;
   double d = (sd1<<3)();
   return 0;
}

Выигрыш в быстродействии я не проверял. Ещё - нужно проверить переносимость, при необходимости, возможно, поменять порядок элементов в структурах. И, если не требуются присвоения подобные 
Код

 double d = (sd1<<3)();

можно копировать не число, а только ссылку, возможно, на этом тоже удастся что-то выгадать.

 smile прочитан адресатами

Это сообщение отредактировал(а) Ln78 - 26.1.2008, 18:49
PM MAIL   Вверх
archimed7592
Дата 26.1.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Прочитано адресатом smile.

Это сообщение отредактировал(а) archimed7592 - 26.1.2008, 18:52


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 26.1.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Ln78, обсуждение действий (ко)модераторов в соответствующем разделе.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 26.1.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



JackYF, в данном разделе мы с тобой такие же пользователи как и Ln78 smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ln78
Дата 26.1.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



-------------------
P.S. Кстати, archimed7592, твой пример вряд ли вообще где-то будет правильно работать.
(это не оффтоп, оставлено  smile )

Это сообщение отредактировал(а) Ln78 - 26.1.2008, 18:50
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.