Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Представление данных


Автор: Golod 8.5.2004, 09:10
Господа! Прошу помочь, я понимаю, что мой вопрос не совсем подходит для данного форума, но всё же.
Я столкнулся с такой проблеммой: необходимо произвести операции над числами в машинном коде с плавающей запятой в 32-разрядном формате. Даны 2 числа: А=199,375 и В=-69 13/16.
Как представить их в 16 системе счисления понятно, также аонятно, как их представитьнепосредственно в машинном коде, но вот только не пончтно, как будет выглядеть мантиса второго числа. По идее знак числа храниться отдельно от мантисы, но если рассуждать так, то все наши действия сложения и вычитания приведут к получению неправильного результата (как если бы отрицательное число было положительным). Может быть компьютер сразу смотрит на знак числа, записывает его модуль в память и заменяет все операции сложения на операции вычитания и наоборот???

Автор: Dr.Drunk 10.5.2004, 09:55
Цитата(Golod @ 8.5.2004, 09:10)
Может быть компьютер сразу смотрит на знак числа, записывает его модуль в память и заменяет все операции сложения на операции вычитания и наоборот???

Насколько я помню, "он примерно так и делает" (по крайней мере когда я FPU баловался проблем особых с знаками не испытывал wink.gif )


Автор: ida 10.5.2004, 17:54
Это все-таки скорее всего в ASM. То что он их складывает это точно (вычитать не умеет smile.gif), а там, где число отрицательное, просто добавляется единица в начале (если в двоичном коде записать). То есть положительные числа начинаются с нуля, отрицательные с единицы, и при сложении они складываются по обычным правилам. По-моему так... уточню.

Автор: podval 10.5.2004, 19:49
Отрицательные числа представляются в дополнительном коде: инвертируются все разряды, а затем в младший добавляется единица.

Автор: ida 11.5.2004, 19:47
Торрможу..... smile.gif

Автор: 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 нет, то число в доп.коде.
Если само число отрицательное (например Б), то вместо операции А+Б делаем операцию А-Б.

Ещё раз всех благодарю за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)