Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Представление данных 
:(
    Опции темы
Golod
Дата 8.5.2004, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 12.1.2004
Где: Волжский

Репутация: нет
Всего: нет



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

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


--------------------
_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!
PM MAIL WWW ICQ   Вверх
ida
Дата 10.5.2004, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 58



Это все-таки скорее всего в ASM. То что он их складывает это точно (вычитать не умеет smile.gif), а там, где число отрицательное, просто добавляется единица в начале (если в двоичном коде записать). То есть положительные числа начинаются с нуля, отрицательные с единицы, и при сложении они складываются по обычным правилам. По-моему так... уточню.
PM WWW   Вверх
podval
Дата 10.5.2004, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Отрицательные числа представляются в дополнительном коде: инвертируются все разряды, а затем в младший добавляется единица.
PM WWW ICQ   Вверх
ida
Дата 11.5.2004, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 58



Торрможу..... smile.gif
PM WWW   Вверх
Golod
Дата 15.5.2004, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Это конечно всё хорошо, что вы тут всё говорите, но вы меня не совсем поняли. Дел в том, что речь идёт не о 16-разряднойй сетке, а о 32-х. А в 32-х дело обстоит немного по другому. Дело в том, что в 32-х с отрицаетльными числами всё не так. В 16- преписал единицу, и рад, а в 32-х как я уже говорил характеристика хранится отдельно, и поэтому мантиса у нас является модулем мантисы числа. Так суть вопроса вот в чём: При действии А+Б, если число А - положительное, а Б - отрицательное, то в каких кодах брать каждое из них.
PM MAIL   Вверх
DenDen
Дата 15.5.2004, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 25.3.2004

Репутация: нет
Всего: нет



Несколько утверждений
1) Принцип формирования дополнительного кода не зависит от разрядности сетки.
2)Для целых чисел выделения бита под знак не очень нужно(все равно мы получим один и тотже результат и единицу где-то(во флаге ли в регитре ли...)).
3)Для чисел с плавующей точкой бит нужен для того, чтобы после выполнения результата было произведено одно из следующих действий:
1) Сдвиг мантиссы влево на разряд, запись в старший разряд мантиссы единицы. Прибавление к показателю степени 1(положительное число)
2) Оставить все как есть(отрицательное).
В связи с этим, насколько я знаю, формат числа с плавающей точкой такой
1) бит/байт знака
2) сдвиг(показатель степени)
3) мантисса, выровненная на основание системы счиления(8,16,32,64,128 бит)

PM MAIL   Вверх
Golod
Дата 15.5.2004, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Да, но суть не в этом, а в том, что мантиса всегда положительна, и если выполнить А+Б взяв оба числа в прямом коде, то мы получим на самом деле А-Б.
PM MAIL   Вверх
DenDen
Дата 16.5.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
Вот, в принципе должно в большинстве соучаев работать. Хотя безусловно существует какой-то более изящный способ сложения используя знаковые биты . Он довольно хорошо написан у Юрова.

З.ы.

PM MAIL   Вверх
Golod
Дата 21.5.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.5.2004

Репутация: нет
Всего: нет



Огромное спасибо всем, кто откликнулся на мой вопрос. Я уже во всём разобрался. Всё оказалось гораздо проще. Числа с одинаковыми знаками складываются в прямых кодах, и берётся знак любого из них, с разными знаками - если получаем с 1 переноса, то число в пр. коде 1 отбрасывается, если 1 нет, то число в доп.коде.
Если само число отрицательное (например Б), то вместо операции А+Б делаем операцию А-Б.

Ещё раз всех благодарю за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.