![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
![]() в вечном поиске ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 ![]() |
Никак разобраться с этим форматом не могу. Уже понял: первый бит - знак. Следующие 8 - экспонента, правда, что это такое, тоже понимаю с трудом. И оставшиеся 23 - мантисса. Слова хорошие, но, блин, непонятные. Какие арифметические действия нужно произвести, имея по отдельности эти три компонента, чтоб получить полноценный флоат?
|
|
|
![]()
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
![]() Частый гость ![]() ![]() ![]() Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 ![]() |
Для начала расскажи, что такое по-твоему "полноценный флоат"
![]() Ну и если речь о преобразовании к человеческому виду, то формула примерно такая: (-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
|
|
![]() в вечном поиске ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 ![]() |
Окей, спасибо
![]() ЗЫ: под "полноценным" флоат я подразумевал... Ну если иметь: unsigned int Sign; unsigned int Ex; unsigned int Mant; (т.е., соответственно, знак, экспоненту и мантиссу) - как из этого получить флоат) Ну на всякий случай уточняю) На этот вопрос я вроде бы и получил ответ ![]() upd: прога нафих не нужна, мне в конечном итоге нужно на проце, не понимающем плавающую точку, реализовать сравнение двух таких чисел) а это вряд ли возможно без понимания формата ![]() Сообщение отредактировано NewJesus - 3.02.2009 - 20:26 |
|
|
![]()
Вставить ник | Быстрая цитата | Сообщение
#4
|
|
![]() Частый гость ![]() ![]() ![]() Группа: Участник Сообщений: 182 Регистрация: 5.01.2006 Пользователь №: 11345 ![]() |
Эээ, блин
![]() |
|
|
![]()
Вставить ник | Быстрая цитата | Сообщение
#5
|
|
![]() в вечном поиске ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 8163 Регистрация: 24.11.2007 Пользователь №: 21977 ![]() |
Да какая нафиг разница) Формат - он везде един, почти, во всяком случае) Сейчас я просто вникнуть пытаюсь) Получается пока хреново)
|
|
|
![]()
Вставить ник | Быстрая цитата | Сообщение
#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 |
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 5.07.2025 - 08:09 |