Форум: "Потрепаться";
Поиск по всему сайту: 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-42736           Игорь                 2002-01-30 03:09  2002.02.14  
Вопрос из серии Hellow Word :)


1-42762           _SnAke_               2002-01-31 11:57  2002.02.14  
Отображение главной формы


3-42669           Vopros                2002-01-21 13:10  2002.02.14  
Как создать таблицу Paradox?


3-42655           kaa1971               2002-01-20 22:33  2002.02.14  
Как создать новый индекс в существующей базе Paradox


7-42886           amamed_3071           2001-11-09 13:41  2002.02.14  
Как Форму сохранит в DLL