кодировка чисел с плавающей точкой

Тема в разделе "WASM.ASSEMBLER", создана пользователем FaNt0m, 17 сен 2008.

  1. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Доброго времени суток, господа.
    Не могли бы вы мне объяснить, как кодируются такие типы, как float&double в памяти(желательно через двоичную систему счисления). Например, 5.0 кодируется в 0000A040h...
    З.Ы. нужно реализовать вывод вещественных чисел через вывод целочисленных
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Кодируется мантисса со знаком и экспонента. То есть число представляется в виде ±aaaa*2^bbbb м записывается aaaabbbb.
    Готовые функции идут вместе с масмом каталоге FPULIB. Про плавающую запятую хорошо написано у Зубкова.
     
  3. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Про представление ±aaaa*2^bbbb я слышал... не могли бы вы объяснить мне, как кодируется число float 2.0->00000040h?
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    В разных языках программирования может быть по разному. Чаще всего в ЯВУ double занимает 8 байт и хранится в виде мантиссы и порядка. Первый бит (старший) - знак. Потом 11 бит порядок и 52 бита мантисса.
    Float(single) занимает 4 байта. Первый бит знак. 8 бит - порядок и 23 бита - мантисса.
     
  5. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    float a=4.0;


    4=1*2^2, т е порядок=2, мантисса равна 1...

    однако, вот так 4.0 выглядит в памяти: 00000000 00000000 00100000 01000000

    в чем ошибка?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Partner
    Разве не все сейчас придерживаются FPU стандартов?
    FaNt0m
    Загляни
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    FaNt0m
    FPU мо­жет работать с 32-битовыми, 64-битовыми и 80-битовыми вещественными числами.
    Количество бит|тип |поле знака|поле порядка|константа |поле мантиссы
    32 |REAL4 |1 бит |8 бит |2^7-1=127 |23 бита
    64 |REAL8 |1 бит |11 бит |2^10-1=1023|52 бита
    80 |REAL10|1 бит |15 бит |2^14-1=16383|64 бита
    4.0 выглядит в памяти как 40800000h
    01000000 10000000 00000000 00000000 - Знак числа 0=«+» 1=«-»
    0100000010000000 00000000 00000000 - Порядок 81h-7Fh=+2 в смещенном коде. В смещенном коде число суммируется с константой, которая для 32-битного кода равна 2^7-1=127 2+127=129=81h
    01000000100000000000000000000000 - нормализованная мантисса числа=(1),00000000000000000000000b -- единицу хранят "в уме" из соображений увеличения разрядности числа. Итого +1,0 х 2² = 4,0
    не забывай что старшая часть числа в памяти хранится "правее" т.е в твоих примерах
    5.0 кодируется в 40A00000h
    2.0 = 40000000h
    4.0 = 40800000h
    Используй для этого FPU то есть
    Код (Text):
    1. .data
    2. real_ dd 4.0
    3. integer_ dd ?
    4. .code
    5. finit; инициализируем FPU
    6. fld real_; выбрали вещественное число из памяти
    7. fist integer_; вернули в память целое число с округлением результата
    8. ; текущий режим округления к ближайшему значению установлен в результате
    9. ; выполнения команды finit
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Можно вспомнить хотябы тип real в Паскале. Значения этого типа хранятся в 6 байтах памяти. Однако все-таки лучше использовать стандартные вещественные типы Single (4 bytes), Double (8 bytes) & Extended (10 bytes). Первые два являются "упакованными" типами, второй - "неупакованным" и наиболее естественным для IA-32 FPU типом (в нем старший, всегда единичный, бит нормализованной мантиссы хранится в явном виде).
     
  9. FaNt0m

    FaNt0m New Member

    Публикаций:
    0
    Регистрация:
    19 май 2008
    Сообщения:
    41
    Mikl___, Спасибо за подробное обЪяснение
    Всем спасибо :)