float, он же, гад, 24Е8, он же IEEE 754 |
Здравствуйте, гость ( Вход | Регистрация )
float, он же, гад, 24Е8, он же IEEE 754 |
3.02.2009 - 19:09
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
в вечном поиске Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 |
Никак разобраться с этим форматом не могу. Уже понял: первый бит - знак. Следующие 8 - экспонента, правда, что это такое, тоже понимаю с трудом. И оставшиеся 23 - мантисса. Слова хорошие, но, блин, непонятные. Какие арифметические действия нужно произвести, имея по отдельности эти три компонента, чтоб получить полноценный флоат?
|
|
|
3.02.2009 - 20:16
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Для начала расскажи, что такое по-твоему "полноценный флоат" Потому что 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: Если надо, завтра могу прислать соответствующую прогу для преобразования. За сто тыщ мильёнов баксов, естественно Сообщение отредактировано Graker - 3.02.2009 - 20:23 |
|
|
3.02.2009 - 20:24
Вставить ник | Быстрая цитата | Сообщение
#3
|
|
в вечном поиске Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 |
Окей, спасибо
ЗЫ: под "полноценным" флоат я подразумевал... Ну если иметь: unsigned int Sign; unsigned int Ex; unsigned int Mant; (т.е., соответственно, знак, экспоненту и мантиссу) - как из этого получить флоат) Ну на всякий случай уточняю) На этот вопрос я вроде бы и получил ответ upd: прога нафих не нужна, мне в конечном итоге нужно на проце, не понимающем плавающую точку, реализовать сравнение двух таких чисел) а это вряд ли возможно без понимания формата Сообщение отредактировано NewJesus - 3.02.2009 - 20:26 |
|
|
3.02.2009 - 20:32
Вставить ник | Быстрая цитата | Сообщение
#4
|
|
Частый гость Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 |
Эээ, блин Поищи тогда на всяких сурсфорджах и т.п., как пишутся библиотеки под risc-процы без float-а, там все будет.
|
|
|
3.02.2009 - 20:39
Вставить ник | Быстрая цитата | Сообщение
#5
|
|
в вечном поиске Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 |
Да какая нафиг разница) Формат - он везде един, почти, во всяком случае) Сейчас я просто вникнуть пытаюсь) Получается пока хреново)
|
|
|
3.02.2009 - 20:40
Вставить ник | Быстрая цитата | Сообщение
#6
|
|
Частый гость Группа: Участник Сообщений: 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: Да ты не переживай, пиши, если проблемы. Я в свое время флоат во что только не переводил, так что спрашивай - расскажу Сообщение отредактировано Graker - 4.02.2009 - 09:40 |
|
|
Текстовая версия | Сейчас: 26.04.2024 - 06:25 |