Short real ???

Тема в разделе "WASM.ASSEMBLER", создана пользователем memega, 13 дек 2004.

  1. memega

    memega New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2004
    Сообщения:
    4
    Привет всем.

    Есть такой вопрос:

    перевожу -787.19358031 в действителный короткий (4 байта),

    получаю (вручную) C4 44 CC 63. Забиваю в TASM

    (x dd -787.19358031),

    получаю C4 44 CC 64. Где ошибка?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    на ловца и зверь бежит ;) только что распознал твою переменную свое процедурой, сохранил в дворд и загрузил в еах. это из отладчика:



    EAX C444CC64



    значит, ошибка во вручных расчетах...
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    memega



    Ты округлил в -787.1936, а

    отрицательные округляются к большему,

    т.е. -787.1935
     
  4. memega

    memega New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2004
    Сообщения:
    4
    Спасибо!

    Не просек про округление :dntknw:
     
  5. memega

    memega New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2004
    Сообщения:
    4
    Стоп.

    Все равно немножко не понял.

    787 = 1100010011 = 1,100010011 * 2^9

    Знаковый бит = 1

    Характеристика = 10001000

    Мантисса = 100010011 + коэффициенты от умножения дробной части. Посчитаем их -

    q-1=0,q-2=0,q-3=1,q-4=1,q-5=0,q-6=0,q-7=0,q-8=1,q-9=1,

    q-10=0,q-11=0,q-12=0,q-13=1,q-14=1

    Все число запишется так:

    1 10001000 10001001100110001100011, или в hex

    C4 44 CC 63



    а где округление?

    Что-то не просекаю...
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Способ округления в FPU зависит от установки RC-флагов в control word. По умолчанию RC = 00b, т.е. округление к ближайшему значению (соответственно знак при этом роли не играет). В данном случае получается -787.1936 = С444СС64h



    PS: Для округления в двоичном виде берешь дополнительный младший бит мантиссы, если он = 0, то без изменения; если 1, то прибавляешь 1 к младшему биту мантиссы.
     
  7. memega

    memega New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2004
    Сообщения:
    4
    вот теперь понял. Спасибо большое
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    memega

    см.PS к предыдущему посту
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    С округлением до ближайшего значения есть одна хитрость:

    в соответствии со стандаротом IEEE, если число лежит ровно посередине между двумя допустимыми значениями, то оно округляется к ближайшему "четному", т.е. тому у которого младший значащий бит = 0. Например и 1.5 и 2.5 округляются до 2.



    Поэтому правило округления в двоичном виде можно сформулировать так:

    добавить к мантиссе единицу младшего разряда если

    (следующий контрольный бит = 1) И ((остаток не равен 0) ИЛИ (остаток = 0) И (младший бит мантиссы = 1))