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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с битовыми полями, Преобразование битовых полей в FLOAT и 
:(
    Опции темы
Nikole
Дата 12.9.2005, 00:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как в С++ получить из битовых полей объединения беззнаковых
литер (unsigned char) значение переменной типа float,
если извесен порядок следования полей (элементов искомого
числа): мантисса M, знак мантиссы (0-положит, 1-отрицат),
знак порядка, порядок N, а также известно количество бит,
отводимое для хранения мантиссы (KBM) и для хранения порядка (KBP).
Например, если KBM=2, KBP=3, то набор бит 11 0 1 110 (битовые
поля разделены пробелами) должен дать число +3*10^(-6)=3/1000000.
Нужна высокая скорость выполнения операций, поэтому функции POW и др.
подобные использовать не желательно.
  Вверх
Дрон
Дата 12.9.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Фигасе...

Раза с 5-го понял что требуется. А вот что дано всё равно не понимаю smile

Цитата(Nikole @ 12.9.2005, 01:18)
битовых полей объединения беззнаковых литер

И что это такое? Как-то я такое и представить не могу. Битовые поля знаю. Объединения знаю. "Беззнаковые литеры" тоже знаю. Но чтобы всё вместе...

Цитата(Nikole @ 12.9.2005, 01:18)
а также известно количество бит,
отводимое для хранения мантиссы (KBM) и для хранения порядка (KBP).

Оно фиксированно или задаётся переменными?

Цитата(Nikole @ 12.9.2005, 01:18)
Нужна высокая скорость выполнения операций, поэтому функции POW и др.
подобные использовать не желательно.

Кому нужна?
Если это студенческая лабораточная работа, то это одно дело. Если же это реальная задача, то хоть скажите на каком процессоре это всё делается -- может проще будет асм использовать?
Добавлено @ 00:39
В догонку.

Цитата(Nikole @ 12.9.2005, 01:18)
должен дать число +3*10^(-6)=3/1000000.

Используются степени 10-ки? Со степенями 2-ки было бы гораздо проще.


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 12.9.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Если честно, то до конца не врубился что требуется(но в отличии от Дрона прочитал 3 раза).
Я понял задачу так - есть число очень дикого формата и нам его надо преобразовать в юзабельный флоат.

Цитата(Nikole @ 12.9.2005, 04:18)
Нужна высокая скорость выполнения операций, поэтому функции POW и др.
подобные использовать не желательно.

Не получится без pow. Если не отказаться от десятичной СС.

Итак. Для начала восстановим экспоненту(ака порядок). Будем считать, что мы восстанавливаем float. Хотя лучше бы long double, ну да ладно. Не помню есть ли для него pow.
Код

int exp = getExponentFromUnion(UNION);  // <-- биты экспоненты из объединения
if(getExponentSign(UNION)) // <-- восстанавливаем знак
 exp=-exp; // если нужно, экспонента стала отрицательной

//делаем число
float rs = getMantiss(UNION) * pow(10, exp); 
(*(uint32_t*)(&rs)) |= getMantissSign() << 31; //восстанавливаем знак числа


Вроде должно работать. Но не проверял.


Цитата
Оно фиксированно или задаётся переменными?

Оно фиксированно хотя бы IEEE754. Никаким бубном в float нельзя будет запихнуть Float.MAX_VALUE+1.

Цитата
Со степенями 2-ки было бы гораздо проще.

Помимо того что было бы проще, при преобразовании из 2-ного формата Дикого Флоата в IEEE'овский флоат не терялась бы точность. Ведь 0,3 нельзя представить в двоичном формате.

Цитата

Используются степени 10-ки?

Безумный Флоат. Более диким был лишь Безумный Синглтон smile

Это сообщение отредактировал(а) Mayk - 12.9.2005, 07:58


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


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



мне очень понравился ваш анализ... интересно что обо всём этом думает сам Nicole
smile smile smile smile


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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