Привет всем. Есть такой вопрос: перевожу -787.19358031 в действителный короткий (4 байта), получаю (вручную) C4 44 CC 63. Забиваю в TASM (x dd -787.19358031), получаю C4 44 CC 64. Где ошибка?
на ловца и зверь бежит только что распознал твою переменную свое процедурой, сохранил в дворд и загрузил в еах. это из отладчика: EAX C444CC64 значит, ошибка во вручных расчетах...
Стоп. Все равно немножко не понял. 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 а где округление? Что-то не просекаю...
Способ округления в FPU зависит от установки RC-флагов в control word. По умолчанию RC = 00b, т.е. округление к ближайшему значению (соответственно знак при этом роли не играет). В данном случае получается -787.1936 = С444СС64h PS: Для округления в двоичном виде берешь дополнительный младший бит мантиссы, если он = 0, то без изменения; если 1, то прибавляешь 1 к младшему биту мантиссы.
С округлением до ближайшего значения есть одна хитрость: в соответствии со стандаротом IEEE, если число лежит ровно посередине между двумя допустимыми значениями, то оно округляется к ближайшему "четному", т.е. тому у которого младший значащий бит = 0. Например и 1.5 и 2.5 округляются до 2. Поэтому правило округления в двоичном виде можно сформулировать так: добавить к мантиссе единицу младшего разряда если (следующий контрольный бит = 1) И ((остаток не равен 0) ИЛИ (остаток = 0) И (младший бит мантиссы = 1))