Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> float, он же, гад, 24Е8, он же IEEE 754
NotLiquid
сообщение 3.02.2009 - 19:09

в вечном поиске
*******

Группа: Участник
Сообщений: 8163
Регистрация: 24.11.2007
Пользователь №: 21977


Никак разобраться с этим форматом не могу. Уже понял: первый бит - знак. Следующие 8 - экспонента, правда, что это такое, тоже понимаю с трудом. И оставшиеся 23 - мантисса. Слова хорошие, но, блин, непонятные. Какие арифметические действия нужно произвести, имея по отдельности эти три компонента, чтоб получить полноценный флоат?
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 3.02.2009 - 20:16

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Для начала расскажи, что такое по-твоему "полноценный флоат" smile.gif Потому что 24Е8 - это и есть полноценный флоат, вообще-то.

Ну и если речь о преобразовании к человеческому виду, то формула примерно такая:

(-1)^S*(2^(E+128))*M, где

S - старший разряд, т.е. знак;
E - следующие 8 разрядов, т.е. экспонента;
M - мантисса, которая вычисляется по формуле:
M = 1 + (1/2)*(M & (1<<23)) + (1/4)*(M & (1<<22)) + (1/8)(M & (1<<21)) и так до последнего разряда.

Проверь только по стандарту на предмет 128 прибавляется к экспоненте, или 127. Ну и посмотри там же, как выглядят NAN и QNAN. И - внимание! - не забывай, что формула вычисления мантиссы начинается с единицы, т.е. она держится "в уме" и не входит в разрядную сетку float-числа.

P.S. А, да. Знак "^" здесь - это возведение в степень.

upd: Если надо, завтра могу прислать соответствующую прогу для преобразования. За сто тыщ мильёнов баксов, естественно smile.gif

Сообщение отредактировано Graker - 3.02.2009 - 20:23
Перейти в начало страницы
 
+Цитировать сообщение
NotLiquid
сообщение 3.02.2009 - 20:24

в вечном поиске
*******

Группа: Участник
Сообщений: 8163
Регистрация: 24.11.2007
Пользователь №: 21977


Окей, спасибо smile.gif

ЗЫ: под "полноценным" флоат я подразумевал... Ну если иметь:
unsigned int Sign;
unsigned int Ex;
unsigned int Mant;
(т.е., соответственно, знак, экспоненту и мантиссу) - как из этого получить флоат) Ну на всякий случай уточняю) На этот вопрос я вроде бы и получил ответ smile.gif

upd: прога нафих не нужна, мне в конечном итоге нужно на проце, не понимающем плавающую точку, реализовать сравнение двух таких чисел) а это вряд ли возможно без понимания формата smile.gif

Сообщение отредактировано NewJesus - 3.02.2009 - 20:26
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 3.02.2009 - 20:32

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Эээ, блин smile.gif Поищи тогда на всяких сурсфорджах и т.п., как пишутся библиотеки под risc-процы без float-а, там все будет.
Перейти в начало страницы
 
+Цитировать сообщение
NotLiquid
сообщение 3.02.2009 - 20:39

в вечном поиске
*******

Группа: Участник
Сообщений: 8163
Регистрация: 24.11.2007
Пользователь №: 21977


Да какая нафиг разница) Формат - он везде един, почти, во всяком случае) Сейчас я просто вникнуть пытаюсь) Получается пока хреново)
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 3.02.2009 - 20:40

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Аа, кстати, я изначально не на тот вопрос ответ написал.

Если иметь:
unsigned int Sign;
unsigned int Ex;
unsigned int Mant;
то число с плавающей точкой получится:
(Sign<<31) | ((Ex-127)<<23) | ((Mant<<1) & 0x7fffff)
если в мантиссе не учтена единица, или:
(Sign<<31) | ((Ex-128)<<23) | (Mant & 0x7fffff)
если учтена.

Примерно так.

upd: Да ты не переживай, пиши, если проблемы. Я в свое время флоат во что только не переводил, так что спрашивай - расскажу smile.gif

Сообщение отредактировано Graker - 4.02.2009 - 09:40
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 26.04.2024 - 06:25