Доброго времени суток, господа. Не могли бы вы мне объяснить, как кодируются такие типы, как float&double в памяти(желательно через двоичную систему счисления). Например, 5.0 кодируется в 0000A040h... З.Ы. нужно реализовать вывод вещественных чисел через вывод целочисленных
Кодируется мантисса со знаком и экспонента. То есть число представляется в виде ±aaaa*2^bbbb м записывается aaaabbbb. Готовые функции идут вместе с масмом каталоге FPULIB. Про плавающую запятую хорошо написано у Зубкова.
Про представление ±aaaa*2^bbbb я слышал... не могли бы вы объяснить мне, как кодируется число float 2.0->00000040h?
В разных языках программирования может быть по разному. Чаще всего в ЯВУ double занимает 8 байт и хранится в виде мантиссы и порядка. Первый бит (старший) - знак. Потом 11 бит порядок и 52 бита мантисса. Float(single) занимает 4 байта. Первый бит знак. 8 бит - порядок и 23 бита - мантисса.
float a=4.0; 4=1*2^2, т е порядок=2, мантисса равна 1... однако, вот так 4.0 выглядит в памяти: 00000000 00000000 00100000 01000000 в чем ошибка?
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): .data real_ dd 4.0 integer_ dd ? .code finit; инициализируем FPU fld real_; выбрали вещественное число из памяти fist integer_; вернули в память целое число с округлением результата ; текущий режим округления к ближайшему значению установлен в результате ; выполнения команды finit
Можно вспомнить хотябы тип real в Паскале. Значения этого типа хранятся в 6 байтах памяти. Однако все-таки лучше использовать стандартные вещественные типы Single (4 bytes), Double (8 bytes) & Extended (10 bytes). Первые два являются "упакованными" типами, второй - "неупакованным" и наиболее естественным для IA-32 FPU типом (в нем старший, всегда единичный, бит нормализованной мантиссы хранится в явном виде).