Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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 (не число)
сравнивать удобно - просто как два целых



Страницы: 1 вся ветка

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

Наверх





Память: 0.46 MB
Время: 0.004 c
1-42787
st_Lexa
2002-01-29 17:04
2002.02.14
Кликнул мышкой - получи что-нибудь


1-42712
Quaker
2002-02-01 06:53
2002.02.14
Переделать TActionList


3-42677
Натик
2002-01-18 13:07
2002.02.14
Index is out of date


6-42826
Дмитрий Д.
2001-11-21 12:22
2002.02.14
Права доступа к ресурсу?


3-42661
Net_DAN
2002-01-21 10:57
2002.02.14
Не выгружается серверная часть





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский