![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Hukuma |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
Здравствуйте!
Тема похожа на эту http://forum.vingrad.ru/topic-64014.html Исходные данные - есть последовательность из 4ых байтов - это части числа в формате float. Т.е. знак экспоненты,экспонент, мантисса. нужно из этих 4ых байтов собрать число в формате float.. я понял, что это можно сделать, использую побитовые операции, это как описано в теме, на которую я сослался.. а вопрос такой - а нельзя это сделать проще? Очень туго въезжаю в формат IEEE754. Или нет других путей? |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
как то так.... Это сообщение отредактировал(а) UniBomb - 17.4.2009, 15:05 |
|||
|
||||
| Hukuma |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
Unibomb,спасибо большое..интересный вариант, понравилс очень, сейчас попробую
|
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Жесть какая, 4 байта копировать в 4 байта циклом %) return (float)data[0]; Это сообщение отредактировал(а) GoldFinch - 17.4.2009, 15:29 |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
А теперь спроси у компилятора (у лбого), что он думает по поводу этой строчки. Компилятор ответит, что результатом будет содержимое этой переменной (data[0]), пробразованное во float. А копировать ничего не придётся, если массив data объявить в составе объединения. |
|||
|
||||
| InvalidProperty |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
это истина, ибо 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 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
UniBomb, ок, return *(float*)data;
|
|||
|
||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
GoldFinch,
Жесть какая, 4 байта копировать в 4 байта циклом %) return (float)data[0]; лучше жесть, чем неработающая кривизна ЖлолЖ |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
Это сообщение отредактировал(а) zim22 - 18.4.2009, 07:50 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Rififi, объясни, зачем читать через пост, а не все посты подряд?
|
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
zim22, может все таки лучше через reinterpret_cast имхо.
по сабжу конечно объединения хороши, но и memcpy тоже не плохо. |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
А memcpy никто не пробовал?
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
я сначала сделал вариант с reinterpret_cast, но потом вспомнил, что это опасные преобразования. а static_cast - безопаснее. тем более с ним работает тоже |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
Ау, извращенцы!
Какие Reinterpret'ы и доп. классы, не сходите с ума -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| Hukuma |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 18.2.2009 Репутация: нет Всего: нет |
Огромное всем спасибо за участие!
|
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
mrbrooks, слеподыр! Не углядел!
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Rickert, копировать 4 байта memcpy() - как минимум глупо
|
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
эх, тема была бы ещё интересней, если бы тут не занимались членомерством, а предлагали бы новые вариаты фразой "а ещё можно так", вместо "так делат глупо - надо вот так"....
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
в Code::blocks тоже не работает. Вы сами подумайте, как оно может работать!? |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
не должно работать, так как у указателей разный тип, нужно &dest привести к char
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
нет. оно не будет нормально работать. оно будет криво работать. теперь работает.
|
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Факт есть факт: самый простой и правильный способ - использование memcpy. Финт с объединением - это ненужное усложнение кода, а касты к float* не соблюдают выравнивание. |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А данные в объединении с воздуха берутся? Копировать байты по-любому приходится - либо циклом, как предложено выше, либо тем же memcpy, либо ещё чем-то аналогичным. Так зачем копировать данные в какое-то там объединение, если можно скопировать их сразу в переменную типа float? Это сообщение отредактировал(а) UnrealMan - 20.4.2009, 14:12 |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
||||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
инструкцией mov в 32 разрядных системах 4байтовые переменные должны копироваться 1 инструкцией mov (или m2m) использование циклов, функций библиотек языка или апи для копирования 4 байт это бред %) |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
GoldFinch, в С\С++ нет инструкции mov, там вообще нет никаких инструкций
|
|||
|
||||
| Irdis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 108 Регистрация: 21.5.2008 Репутация: нет Всего: 1 |
я тоже умею
Это сообщение отредактировал(а) Irdis - 20.4.2009, 18:24 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
тогда уж так. хотя как уже выяснилось в этой теме - вариант с memcpy - оптимальный.
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
zim22, в каком месте он оптимальный? по скорости? по объему кода? про числу строчек исходника? да ниразу
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
GoldFinch, предлагайте тогда альтернативные варианты. не словом, а делом.
|
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
a он разве не предложил ? и даже обосновал, почему этот вариант ему кажется самым привлекательным:
ну и не забыл охарактеризовать другие подходы :
Как видите и словом и делом |
||||||
|
|||||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
Поставьте бряк на строке с memcpy и войдите внуть функции. Вас перекинет в файл memcpy.asm. Это же ваш любимый ассемблер! Ваши любимые команды! Мечты сбываются Это сообщение отредактировал(а) zim22 - 20.4.2009, 20:13 |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Это не самый лучший способ увидеть результат оптимизации компилятора
Так что товарищи рукоблуды, занимающиеся оптимизацией посредством ассемблерных вставок, могут идти в баню. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
для этого используют push\pop, твой оптимизатор гуан* Добавлено через 6 минут и 13 секунд алсо такой код должен инлайниться, а идея использования отдельный функции для копирования 4 байт в 4 байта ничем не лучше чем если бы memcpy была отдельной функцией |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сорри, но не уловил смысла, нельзя ли иначе (попроще) изъясниться ? |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Смысл примерно следующий: операции со стеком push и pop выполняются типа быстрее, чем простые mov с дополнительным регистром, только вот тупые разработчики компиляторов в Intel и Microsoft об этом не знают. А ещё mov (в отличие от push и pop) занимает страшно много места (вынуждая несчастных пользователей покупать терабайтные винчестеры для хранения полученных таким варварским способом исполнительных файлов). Короче, продемонстрированная оптимизация - полный песец, и, поэтому, ясень пень, тут нужно скорей хвататься за ассемблер, чтобы на нём родить самый оптимальный по своему количеству, скорости и переносимости исходный код. Добавлено @ 01:45 Что касается приведённого мной кода, то он специально подобран так, чтобы всем сразу было видно, во что компилятор может превратить memcpy. Это не было предложением использовать на практике именно такой код. Это сообщение отредактировал(а) UnrealMan - 21.4.2009, 11:26 |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: 0 Всего: 52 |
А вот теперь я слушаю оргаменты. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Рукоблудием надо меньше заниматься - инструкции PUSH/POP выполняются ВДВОЕ/ВТРОЕ медленне, чем MOV Источник - Intel 64 and IA-32 Architectures Optimization reference manual (248966-016), таблица C-12 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |