Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Вниз

Вопрос по Assembler у 


Awex   (2001-12-26 12:36) [0]

Не подскажите как работать с вещественными числами без использования сопроцессора. Как я понимаю придется обходиться числами с фиксированной запятой. Нужно по крайне мере 4 действия, ADD, DIV, MUL, SUB, c ADD,SUB вопросов нет,
а вот DIV и MUL посложней....
Не кто не сталкивался с подобной задачей ?



MBo   (2001-12-26 12:52) [1]

А для чего? 386 или 486SX завалялась или с образовательными целями?
В старых книжках по ассемблеру бывают примеры процедур умножения 32-х разрядных чисел для 16-р процессора - из этого можно исходить. Наверно, где-нибудь есть и для вещественных чисел.



Старик   (2001-12-26 13:35) [2]

А были еще 4-x разрядные i4004. Класс !



Awex   (2001-12-26 15:05) [3]

>2Старик
Ага .. Были, еще и Z80 т...д.......
Но кажется был задан конкретный вопрос....

>2MBo & LL
1. Задача действительно для образовательных целей.
2. В век 286, 386 обходились без сопроцесора, и многие компиляторы, например тот же Pascal, мог по выбору или генерить код для сопроца или генерить код умуляции этих комманд. Хотелось бы знать принципы работы таких "эмулирующих комманд".
Может кто где видел в сети что ли бо подобное ?
Заранее спасибо.



Romkin   (2001-12-26 15:36) [4]

Все довольно просто, сначала выбираешь формат числа, к примеру, в Паскале тип real занимает 6 байт (48 бит)
Каждое такое число состоит из мантиссы и экспоненты (то и другое в двоичном виде), и при этом нормализовано, те имеет вид 1,001010111... * е^(10101), к примеру (в десятичном виде что-то подобное 3,456*10^3). Отсюда получается, что первый бит - всегда 1, и его используют для знака мантиссы.
В реал типе первый бит знак мантиссы, далее 39бит - мантисса (всего 40-бит),
8 бит экспонента (s(1),f(39),e(8)). Число расшифровывается так:
(-1)^s * 2^(e-129) * (1.f)
При производстве умножения - мантисы умножаются со знаком, экспоненты складываются (о переполнении сам подумай)
При сложении меньшее слагаемое сначала денормализуется - shr мантиссы на разницу между экспонентами, после этого складывается и нормализуется результат. и ТД. ТК все числа двоичные, все довольно легко



Awex   (2001-12-26 17:58) [5]

>2Romkin
Большое спасибо.
Засяду на ночку, попробую реализовать все в коде.

Еще раз большое спасибо.



Romkin   (2001-12-26 18:28) [6]

реализуй лучше сразу Double - стандарт IEEE
8 байт, most significant bit - как обычно знак, далее 11 бит - экспонента, 52 бита - мантисса
if 0 < e < 1024 then (-1)^s * 2^(e-1023) * (1.f)
if e=0 and f <> 0 then (-1)^s * 2^(-1022) * (0.f)
if e=0 and f=0 then (-1)^s * 0
if e=2047 and f=0 then (-1)^s * inf
if e=2047 and f<>0 then NaN (не число)
сравнивать удобно - просто как два целых




Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.019 c
1-42779           Зинец Виктор          2002-01-30 16:32  2002.02.14  
Моя прога мешает перезагрузке/перелогину Виндовс :-(


1-42736           Игорь                 2002-01-30 03:09  2002.02.14  
Вопрос из серии Hellow Word :)


14-42833          wild                  2001-12-20 10:17  2002.02.14  
МАЗДАЙ - что это?


1-42794           Stexen                2002-01-28 22:29  2002.02.14  
Nishita ViewLib


6-42823           Den111                2001-11-15 09:22  2002.02.14  
Передача файлов через модем