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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование последовательности байтов во float 
V
    Опции темы
Hukuma
Дата 17.4.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте!

Тема похожа на эту http://forum.vingrad.ru/topic-64014.html

Исходные данные - есть последовательность из 4ых байтов - это части числа в формате float. Т.е. знак экспоненты,экспонент, мантисса.
нужно из этих 4ых байтов собрать число в формате float.. я понял, что это можно сделать, использую побитовые операции, это как описано
в теме, на которую я сослался.. а вопрос такой - а нельзя это сделать проще? Очень туго въезжаю в формат IEEE754. Или нет других путей? 
PM MAIL   Вверх
UniBomb
Дата 17.4.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

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



Код

float  GetFloatFromFourBytes(char [] data)
 {
  union 
   {
     float num;
     char byte[4];
   } SimpleFloat;

  for(int i = 0; i < 4; i++)
   SimpleFloat.byte[i] = data[i];

  return SimpleFloat.num;
 }


как то так....

Это сообщение отредактировал(а) UniBomb - 17.4.2009, 15:05
PM MAIL ICQ Skype   Вверх
Hukuma
Дата 17.4.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Unibomb,спасибо большое..интересный вариант, понравилс очень, сейчас попробую smile
PM MAIL   Вверх
InvalidProperty
Дата 17.4.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



только, наверное, порядок байт в слове еще нужно учитывать


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
GoldFinch
Дата 17.4.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(UniBomb @  17.4.2009,  16:04 Найти цитируемый пост)
float  GetFloatFromFourBytes(char [] data)
 {
  union 
   {
     float num;
     char byte[4];
   } SimpleFloat;
  for(int i = 0; i < 4; i++)
   SimpleFloat.byte[i] = data[i];
  return SimpleFloat.num;
 }

Жесть какая, 4 байта копировать в 4 байта циклом %)

return (float)data[0];

Это сообщение отредактировал(а) GoldFinch - 17.4.2009, 15:29
PM MAIL ICQ   Вверх
UniBomb
Дата 17.4.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

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



Цитата(GoldFinch @  17.4.2009,  15:16 Найти цитируемый пост)
return (float)data[0];

А теперь спроси у компилятора (у лбого), что он думает по поводу этой строчки. Компилятор ответит, что результатом будет содержимое этой переменной (data[0]), пробразованное во float. 

А копировать ничего не придётся, если массив data объявить в составе объединения.
PM MAIL ICQ Skype   Вверх
InvalidProperty
Дата 17.4.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UniBomb @  17.4.2009,  16:22 Найти цитируемый пост)
А копировать ничего не придётся, если массив data объявить в составе объединения. 

это истина, ибо union это не какой-то там struct. Его поля одинаковой длины ссылаются на одно и то же значение


--------------------
dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null
dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null
echo $0 >> $0
PM MAIL ICQ Jabber   Вверх
GoldFinch
Дата 17.4.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



UniBomb, ок, return *(float*)data;
PM MAIL ICQ   Вверх
Rififi
Дата 17.4.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



GoldFinch, 
Жесть какая, 4 байта копировать в 4 байта циклом %)

return (float)data[0];

лучше жесть, чем неработающая кривизна ЖлолЖ
PM MAIL   Вверх
zim22
Дата 18.4.2009, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Код

float  GetFloatFromFourBytes(void *data)
 {
...
   SimpleFloat.num = *static_cast<float*>(data);



Это сообщение отредактировал(а) zim22 - 18.4.2009, 07:50


--------------------
PM MAIL   Вверх
GoldFinch
Дата 18.4.2009, 10:15 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Rififi, объясни, зачем читать через пост, а не все посты подряд?
PM MAIL ICQ   Вверх
mrbrooks
Дата 20.4.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



zim22, может все таки лучше через reinterpret_cast имхо.

по сабжу конечно объединения хороши, но и memcpy тоже не плохо.
PM MAIL   Вверх
Rickert
Дата 20.4.2009, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



А memcpy никто не пробовал? smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
zim22
Дата 20.4.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(mrbrooks @  20.4.2009,  08:15 Найти цитируемый пост)
может все таки лучше через reinterpret_cast имхо.

я сначала сделал вариант с reinterpret_cast, но потом вспомнил, что это опасные преобразования.
а static_cast - безопаснее. тем более с ним работает тоже smile


--------------------
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zim22 @  20.4.2009,  08:29 Найти цитируемый пост)
я сначала сделал вариант с reinterpret_cast, но потом вспомнил, что это опасные преобразования.

опасные - для классов, для базовых типов - думаю не очень  smile 

Цитата(zim22 @  20.4.2009,  08:29 Найти цитируемый пост)
а static_cast - безопаснее. тем более с ним работает тоже 

если так - то и славно - еще одно решение в копилку.
PM MAIL   Вверх
Rickert
Дата 20.4.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Ау, извращенцы!
Код
const size_t size = sizeof(float);
char d[size] = {0};
float dest;

//some data storing in "d";

memcpy(&dest, d, size);

Какие Reinterpret'ы и доп. классы, не сходите с ума smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
mrbrooks
Дата 20.4.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Rickert @  20.4.2009,  09:58 Найти цитируемый пост)
Ау, извращенцы!
....
Какие Reinterpret'ы и доп. классы, не сходите с ума


сам извращенец. 

если внимательно почитаешь посты - то memcpy уже предложили, до такого гениального парня, как ты. 
 smile 
PM MAIL   Вверх
Hukuma
Дата 20.4.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное всем спасибо за участие! smile очень много нового узнал и вопрос тоже решён smile спасибо большое! smile
PM MAIL   Вверх
Rickert
Дата 20.4.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



mrbrooks, слеподыр! Не углядел! smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
GoldFinch
Дата 20.4.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Rickert, копировать 4 байта memcpy() - как минимум глупо

PM MAIL ICQ   Вверх
UniBomb
Дата 20.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

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



эх, тема была бы ещё интересней, если бы тут не занимались членомерством, а предлагали бы новые вариаты фразой "а ещё можно так", вместо "так делат глупо - надо вот так"....
PM MAIL ICQ Skype   Вверх
Lazin
Дата 20.4.2009, 12:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(UniBomb @  20.4.2009,  11:47 Найти цитируемый пост)
эх, тема была бы ещё интересней, если бы тут не занимались членомерством, а предлагали бы новые вариаты фразой "а ещё можно так", вместо "так делат глупо - надо вот так"....

а можно вот так: 
Код

float dest;
char data[4];
std::copy(data, data + 4, &dest);
 smile 
PM MAIL Skype GTalk   Вверх
zim22
Дата 20.4.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Lazin @  20.4.2009,  12:07 Найти цитируемый пост)
а можно вот так: 

нельзя. я уже так пробовал smile


--------------------
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zim22 @  20.4.2009,  12:50 Найти цитируемый пост)
нельзя. я уже так пробовал

может он не в студии делал?
PM MAIL   Вверх
zim22
Дата 20.4.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(mrbrooks @  20.4.2009,  13:14 Найти цитируемый пост)
может он не в студии делал?

в Code::blocks тоже не работает. Вы сами подумайте, как оно может работать!?


--------------------
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 13:28 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(zim22 @  20.4.2009,  14:25 Найти цитируемый пост)
как оно может работать!?

нормально может работать
data, data + 4, &dest - указатели, должны неявно преобразовываться в итераторы
PM MAIL ICQ   Вверх
Lazin
Дата 20.4.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



не должно работать, так как у указателей разный тип, нужно &dest привести к char
PM MAIL Skype GTalk   Вверх
zim22
Дата 20.4.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(GoldFinch @  20.4.2009,  13:28 Найти цитируемый пост)
нормально может работать

нет. оно не будет нормально работать. оно будет криво работать.

Цитата(Lazin @  20.4.2009,  13:33 Найти цитируемый пост)
нужно &dest привести к char

теперь работает.
Код

std::copy(data, data + 4, (char*)&dest);



--------------------
PM MAIL   Вверх
UnrealMan
Дата 20.4.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UniBomb @  20.4.2009,  11:47 Найти цитируемый пост)
эх, тема была бы ещё интересней, если бы тут не занимались членомерством, а предлагали бы новые вариаты фразой "а ещё можно так", вместо "так делат глупо - надо вот так".... 

Факт есть факт: самый простой и правильный способ - использование memcpy. Финт с объединением - это ненужное усложнение кода, а касты к float* не соблюдают выравнивание.
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(UnrealMan @  20.4.2009,  13:38 Найти цитируемый пост)
Финт с объединением - это ненужное усложнение кода

в чем усложнение то? в написание union. По мне так использование анонимного объединения ничем не хуже memcpy. 
PM MAIL   Вверх
UnrealMan
Дата 20.4.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @  20.4.2009,  13:47 Найти цитируемый пост)
По мне так использование анонимного объединения ничем не хуже memcpy.

А данные в объединении с воздуха берутся? Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy, либо ещё чем-то аналогичным. Так зачем копировать данные в какое-то там объединение, если можно скопировать их сразу в переменную типа float? smile 

Это сообщение отредактировал(а) UnrealMan - 20.4.2009, 14:12
PM MAIL   Вверх
mrbrooks
Дата 20.4.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(UnrealMan @  20.4.2009,  14:03 Найти цитируемый пост)
Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy. Так зачем копировать данные в какое-то там объединение, если можно скопировать их сразу в переменную типа float?

с этим согласный   smile 
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(UnrealMan @  20.4.2009,  15:03 Найти цитируемый пост)
Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy,

инструкцией mov
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)
использование циклов, функций библиотек языка или апи для копирования 4 байт это бред %)

PM MAIL ICQ   Вверх
vinter
Дата 20.4.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



GoldFinch,  в С\С++ нет инструкции mov, там вообще нет никаких инструкций  smile 


--------------------
Мой блог
PM MAIL WWW   Вверх
Irdis
Дата 20.4.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 я тоже умею  smile, (оч. часто юзаю)
Код

float ConvertCharToFloat(char* a)
{
    float n;
    char* n1;
    float* n2=&n;
    n1=(char *) n2;
    for (int i=0;i<4;i++)
        n1[i]=a[i];
    return n;
}



Это сообщение отредактировал(а) Irdis - 20.4.2009, 18:24
PM MAIL   Вверх
zim22
Дата 20.4.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(Irdis @  20.4.2009,  18:18 Найти цитируемый пост)
я тоже умею  , (оч. часто юзаю)

тогда уж так. хотя как уже выяснилось в этой теме - вариант с memcpy - оптимальный.
Код

float ConvertCharToFloat(char* a)
{
    float result;
    for (int i = 0; i != 4; ++i)
        ((char*)&result)[i] = a[i];
    return result;
}



--------------------
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



zim22, в каком месте он оптимальный? по скорости? по объему кода? про числу строчек исходника? да ниразу
PM MAIL ICQ   Вверх
zim22
Дата 20.4.2009, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



GoldFinch, предлагайте тогда альтернативные варианты. не словом, а делом.


--------------------
PM MAIL   Вверх
mes
Дата 20.4.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  20.4.2009,  18:10 Найти цитируемый пост)
GoldFinch, предлагайте тогда альтернативные варианты. не словом, а делом. 

 a он разве не предложил ?
Цитата(GoldFinch @  17.4.2009,  15:53 Найти цитируемый пост)
*(float*)data

 и даже обосновал, почему этот вариант ему кажется самым привлекательным:
Цитата(GoldFinch @  20.4.2009,  13:21 Найти цитируемый пост)
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)

ну и не забыл охарактеризовать  другие подходы :

Цитата(GoldFinch @  20.4.2009,  13:21 Найти цитируемый пост)
использование циклов, функций библиотек языка или апи для копирования 4 байт это бред %)

Как видите и словом и делом smile



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


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(GoldFinch @  20.4.2009,  18:54 Найти цитируемый пост)
в каком месте он оптимальный? по скорости? по объему кода? про числу строчек исходника? да ниразу

Цитата(GoldFinch @  20.4.2009,  14:21 Найти цитируемый пост)
в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m)

Поставьте бряк на строке с memcpy и войдите внуть функции. Вас перекинет в файл memcpy.asm. Это же ваш любимый ассемблер! Ваши любимые команды! Мечты сбываются  smile 

Это сообщение отредактировал(а) zim22 - 20.4.2009, 20:13


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


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(mes @  20.4.2009,  20:23 Найти цитируемый пост)
и даже обосновал, почему этот вариант ему кажется самым привлекательным:

Цитата(mes @  20.4.2009,  20:23 Найти цитируемый пост)
ну и не забыл охарактеризовать  другие подходы :

круто, а когда надо будет строку с цифрами выражение парсить будем lua предлагать?

Это сообщение отредактировал(а) vinter - 20.4.2009, 20:36


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 20.4.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  20.4.2009,  20:03 Найти цитируемый пост)
Поставьте бряк на строке с memcpy и войдите внуть функции. 

Это не самый лучший способ увидеть результат оптимизации компилятора smile Не знаю, как гнусь, а более-менее новые VC++ и IC++ умеют вместо вызова memcpy делать те же mov:

Код
void binary_to_float(const char* data, float& result)
004043C0  mov         eax,dword ptr [data] 
004043C4  mov         ecx,dword ptr [result] 
{
    std::memcpy(&result, data, sizeof(result));
004043C8  mov         edx,dword ptr [eax] 
004043CA  mov         dword ptr [ecx],edx 
}

Так что товарищи рукоблуды, занимающиеся оптимизацией посредством ассемблерных вставок, могут идти в баню.
PM MAIL   Вверх
GoldFinch
Дата 20.4.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(UnrealMan @  20.4.2009,  22:53 Найти цитируемый пост)
004043C8  mov         edx,dword ptr [eax] 
004043CA  mov         dword ptr [ecx],edx 

для этого используют push\pop, твой оптимизатор гуан*

Добавлено через 6 минут и 13 секунд
алсо такой код должен инлайниться, а идея использования отдельный функции для копирования 4 байт в 4 байта ничем не лучше чем если бы memcpy была отдельной функцией
PM MAIL ICQ   Вверх
mes
Дата 20.4.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  20.4.2009,  21:27 Найти цитируемый пост)
для этого используют push\pop, твой оптимизатор гуан*

Добавлено через 6 минут и 13 секунд
алсо такой код должен инлайниться, а идея использования отдельный функции для копирования 4 байт в 4 байта ничем не лучше чем если бы memcpy была отдельной функцией 

сорри, но не уловил смысла, нельзя ли иначе (попроще) изъясниться ?



--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 21.4.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  20.4.2009,  22:46 Найти цитируемый пост)
сорри, но не уловил смысла, нельзя ли иначе (попроще) изъясниться ?

Смысл примерно следующий: операции со стеком push и pop выполняются типа быстрее, чем простые mov с дополнительным регистром, только вот тупые разработчики компиляторов в Intel и Microsoft об этом не знают. А ещё mov (в отличие от push и pop) занимает страшно много места (вынуждая несчастных пользователей покупать терабайтные винчестеры для хранения полученных таким варварским способом исполнительных файлов). Короче, продемонстрированная оптимизация - полный песец, и, поэтому, ясень пень, тут нужно скорей хвататься за ассемблер, чтобы на нём родить самый оптимальный по своему количеству, скорости и переносимости исходный код.

Добавлено @ 01:45
Что касается приведённого мной кода, то он специально подобран так, чтобы всем сразу было видно, во что компилятор может превратить memcpy. Это не было предложением использовать на практике именно такой код.

Это сообщение отредактировал(а) UnrealMan - 21.4.2009, 11:26
PM MAIL   Вверх
Rickert
Дата 21.4.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Цитата(GoldFinch @  20.4.2009,  11:40 Найти цитируемый пост)
Rickert, копировать 4 байта memcpy() - как минимум глупо

А вот теперь я слушаю оргаменты.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
xvr
Дата 21.4.2009, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(GoldFinch @ 20.4.2009,  22:27)
Цитата(UnrealMan @  20.4.2009,  22:53 Найти цитируемый пост)
004043C8  mov         edx,dword ptr [eax] 
004043CA  mov         dword ptr [ecx],edx 

для этого используют push\pop, твой оптимизатор гуан*

Рукоблудием надо меньше заниматься - инструкции PUSH/POP выполняются ВДВОЕ/ВТРОЕ медленне, чем MOV  smile 
Источник - Intel 64 and IA-32 Architectures Optimization reference manual (248966-016), таблица C-12

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.1057 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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