Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Представление данных |
Автор: Golod 8.5.2004, 09:10 |
Господа! Прошу помочь, я понимаю, что мой вопрос не совсем подходит для данного форума, но всё же. Я столкнулся с такой проблеммой: необходимо произвести операции над числами в машинном коде с плавающей запятой в 32-разрядном формате. Даны 2 числа: А=199,375 и В=-69 13/16. Как представить их в 16 системе счисления понятно, также аонятно, как их представитьнепосредственно в машинном коде, но вот только не пончтно, как будет выглядеть мантиса второго числа. По идее знак числа храниться отдельно от мантисы, но если рассуждать так, то все наши действия сложения и вычитания приведут к получению неправильного результата (как если бы отрицательное число было положительным). Может быть компьютер сразу смотрит на знак числа, записывает его модуль в память и заменяет все операции сложения на операции вычитания и наоборот??? |
Автор: Dr.Drunk 10.5.2004, 09:55 | ||
Насколько я помню, "он примерно так и делает" (по крайней мере когда я FPU баловался проблем особых с знаками не испытывал ![]() |
Автор: ida 10.5.2004, 17:54 |
Это все-таки скорее всего в ASM. То что он их складывает это точно (вычитать не умеет ![]() |
Автор: podval 10.5.2004, 19:49 |
Отрицательные числа представляются в дополнительном коде: инвертируются все разряды, а затем в младший добавляется единица. |
Автор: ida 11.5.2004, 19:47 |
Торрможу..... ![]() |
Автор: Golod 15.5.2004, 07:28 |
Это конечно всё хорошо, что вы тут всё говорите, но вы меня не совсем поняли. Дел в том, что речь идёт не о 16-разряднойй сетке, а о 32-х. А в 32-х дело обстоит немного по другому. Дело в том, что в 32-х с отрицаетльными числами всё не так. В 16- преписал единицу, и рад, а в 32-х как я уже говорил характеристика хранится отдельно, и поэтому мантиса у нас является модулем мантисы числа. Так суть вопроса вот в чём: При действии А+Б, если число А - положительное, а Б - отрицательное, то в каких кодах брать каждое из них. |
Автор: DenDen 15.5.2004, 12:56 |
Несколько утверждений 1) Принцип формирования дополнительного кода не зависит от разрядности сетки. 2)Для целых чисел выделения бита под знак не очень нужно(все равно мы получим один и тотже результат и единицу где-то(во флаге ли в регитре ли...)). 3)Для чисел с плавующей точкой бит нужен для того, чтобы после выполнения результата было произведено одно из следующих действий: 1) Сдвиг мантиссы влево на разряд, запись в старший разряд мантиссы единицы. Прибавление к показателю степени 1(положительное число) 2) Оставить все как есть(отрицательное). В связи с этим, насколько я знаю, формат числа с плавающей точкой такой 1) бит/байт знака 2) сдвиг(показатель степени) 3) мантисса, выровненная на основание системы счиления(8,16,32,64,128 бит) |
Автор: Golod 15.5.2004, 15:18 |
Да, но суть не в этом, а в том, что мантиса всегда положительна, и если выполнить А+Б взяв оба числа в прямом коде, то мы получим на самом деле А-Б. |
Автор: DenDen 16.5.2004, 11:17 |
Самый простой вариант реализации с положительными мантиссами. Старший(знаковый) бит в сложении не участвует 1. Пусть даны 2 числа a=(2^(i+sdvig_a))*a_i,b=(2^(i+sdvig_b))*b_i Вариант их сложении 1) если sdvig_a>sdvig_b+mantiss_length--rez=a 2) Если сдвиги перекрываются(для краткости пложим, что они даже равны) складываются a_i+b_i. Далее два варианта либо есть перенос в старшем разряде либо нет 2.1)Перенос есть. Тут уже 4 варинта(все по старшим битам) 2.1.1) 00-большое положительное число увеличение сдвига на единицу и см. предыдущиц ответ 2.1.2) 10,01 в принципе то же самое но знак выставляется в зависимости от модулей слагаемых 2.1.3)11- вот тут лягушка прыгает в воду. Если просто складывать 2 отрицательных числа, то полчуим весьма интересный резльтат(-ff+-ff=-fe). т.е в этом случае результат должен быть neg(neg(a)+neg(b)). очевидно операция neg производится только над мантиссами чисел(в случае равных сдвигов)далле см. п.2.1.1. 2.2)Переноса нет Варианты 00--маленькие положитльные числа 01,10-знаки выставляются в зависимости от модулей чисел 11-см п.2.1.3 Вот, в принципе должно в большинстве соучаев работать. Хотя безусловно существует какой-то более изящный способ сложения используя знаковые биты . Он довольно хорошо написан у Юрова. З.ы. |
Автор: Golod 21.5.2004, 23:05 |
Огромное спасибо всем, кто откликнулся на мой вопрос. Я уже во всём разобрался. Всё оказалось гораздо проще. Числа с одинаковыми знаками складываются в прямых кодах, и берётся знак любого из них, с разными знаками - если получаем с 1 переноса, то число в пр. коде 1 отбрасывается, если 1 нет, то число в доп.коде. Если само число отрицательное (например Б), то вместо операции А+Б делаем операцию А-Б. Ещё раз всех благодарю за помощь. |