![]() |
|
![]() ![]() ![]() |
|
Golod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Господа! Прошу помочь, я понимаю, что мой вопрос не совсем подходит для данного форума, но всё же.
Я столкнулся с такой проблеммой: необходимо произвести операции над числами в машинном коде с плавающей запятой в 32-разрядном формате. Даны 2 числа: А=199,375 и В=-69 13/16. Как представить их в 16 системе счисления понятно, также аонятно, как их представитьнепосредственно в машинном коде, но вот только не пончтно, как будет выглядеть мантиса второго числа. По идее знак числа храниться отдельно от мантисы, но если рассуждать так, то все наши действия сложения и вычитания приведут к получению неправильного результата (как если бы отрицательное число было положительным). Может быть компьютер сразу смотрит на знак числа, записывает его модуль в память и заменяет все операции сложения на операции вычитания и наоборот??? |
|||
|
||||
Dr.Drunk |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 12.1.2004 Где: Волжский Репутация: нет Всего: нет |
Насколько я помню, "он примерно так и делает" (по крайней мере когда я FPU баловался проблем особых с знаками не испытывал ![]() --------------------
_Theory_ is when you know everything but nothning works._Practice_ is when everything works but no one knows why._IN THIS PLACE_ we're combining theory and practice -nothing works and no one knows why! |
|||
|
||||
ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: нет Всего: 58 |
Это все-таки скорее всего в ASM. То что он их складывает это точно (вычитать не умеет
![]() |
|||
|
||||
podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Отрицательные числа представляются в дополнительном коде: инвертируются все разряды, а затем в младший добавляется единица.
|
|||
|
||||
ida |
|
|||
![]() замужем ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2277 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: нет Всего: 58 |
Торрможу.....
![]() |
|||
|
||||
Golod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Это конечно всё хорошо, что вы тут всё говорите, но вы меня не совсем поняли. Дел в том, что речь идёт не о 16-разряднойй сетке, а о 32-х. А в 32-х дело обстоит немного по другому. Дело в том, что в 32-х с отрицаетльными числами всё не так. В 16- преписал единицу, и рад, а в 32-х как я уже говорил характеристика хранится отдельно, и поэтому мантиса у нас является модулем мантисы числа. Так суть вопроса вот в чём: При действии А+Б, если число А - положительное, а Б - отрицательное, то в каких кодах брать каждое из них.
|
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Несколько утверждений
1) Принцип формирования дополнительного кода не зависит от разрядности сетки. 2)Для целых чисел выделения бита под знак не очень нужно(все равно мы получим один и тотже результат и единицу где-то(во флаге ли в регитре ли...)). 3)Для чисел с плавующей точкой бит нужен для того, чтобы после выполнения результата было произведено одно из следующих действий: 1) Сдвиг мантиссы влево на разряд, запись в старший разряд мантиссы единицы. Прибавление к показателю степени 1(положительное число) 2) Оставить все как есть(отрицательное). В связи с этим, насколько я знаю, формат числа с плавающей точкой такой 1) бит/байт знака 2) сдвиг(показатель степени) 3) мантисса, выровненная на основание системы счиления(8,16,32,64,128 бит) |
|||
|
||||
Golod |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Да, но суть не в этом, а в том, что мантиса всегда положительна, и если выполнить А+Б взяв оба числа в прямом коде, то мы получим на самом деле А-Б.
|
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Самый простой вариант реализации с положительными мантиссами.
Старший(знаковый) бит в сложении не участвует 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 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 8.5.2004 Репутация: нет Всего: нет |
Огромное спасибо всем, кто откликнулся на мой вопрос. Я уже во всём разобрался. Всё оказалось гораздо проще. Числа с одинаковыми знаками складываются в прямых кодах, и берётся знак любого из них, с разными знаками - если получаем с 1 переноса, то число в пр. коде 1 отбрасывается, если 1 нет, то число в доп.коде.
Если само число отрицательное (например Б), то вместо операции А+Б делаем операцию А-Б. Ещё раз всех благодарю за помощь. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |