Форум: "Потрепаться";
Поиск по всему сайту: 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.025 c
3-42657           DeNNiss               2002-01-17 08:08  2002.02.14  
Помогите пожалуйста!


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


14-42831          lel                   2001-12-24 12:48  2002.02.14  
Где в Москве выпить?


3-42688           Ars P                 2002-01-22 13:04  2002.02.14  
Создаю алиас в SQL Explorer-е для базы interbase, расположенной на сервере...


3-42665           Eduard                2002-01-21 09:47  2002.02.14  
InsertRecord и DateTime