Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
| Lady_Arvena |
18.1.2009, 23:21
Сообщение
#1
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Есть ещё один вопрос, который мне очень непонятен...
Самое ужасное, что примера по нему вообще нет, то есть даже непонятно, как должно выглядеть то, чего они от меня хотят Вот такое задание, если я не слишком тебя загружаю своей арифметикой, объясни пожалуйста, как делать. Надо сложить два числа А и В, которые представлены в виде с плавающей точкой. Вот эти числа: [Ап] = +3; (порядок А) [Ам] = +0.9; (мантисса А) [Bп] = -1; (порядок В) [Bм] = +0.55; (мантисса) --> (тут тоже не совсем понятно, а может ли быть мантисса и порядок одного операнда отличных знаков? Сколько смотрю про эти числа, нигде такого не встречала (чтобы порядок, как тут, -, а мантисса +)). При этом указано, что порядки и мантиссы чисел А и В, надо представить в двоичной системе счисления и сформировать для них прямые коды. А потом, на основании прямых, сформировать обратные, и эти обратные уже использовать для вычислений. Результат окончательно представлять потом в прямом коде в нормализованной форме. Самое непонятное: Разрядность модуля порядка должна быть равна 3, разрядность модуля мантиссы - 6 . Как это сделать? И ещё вот вопрос: как такие числа (с плавающей точкой) представляются? Порядок отдельно, а мантисса отдельно? Буду очень благодарна за любую помощь по этому вопросу |
| PolPoll |
19.1.2009, 16:12
Сообщение
#2
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
1) (тут тоже не совсем понятно, а может ли быть мантисса и порядок одного операнда отличных знаков? Сколько смотрю про эти числа, нигде такого не встречала (чтобы порядок, как тут, -, а мантисса +)). 2) И ещё вот вопрос: как такие числа (с плавающей точкой) представляются? Порядок отдельно, а мантисса отдельно? пример +0.5 * 10 в степени -5 = 0.000005 +0.5 мантисса -5 порядок разные знаки... пример -0.5 * 10 в степени +5 = -5000 -0.5 мантисса +5 порядок разные знаки... 2) да пример с плавающей точкой где-то здесь был - сейчас поищу -------------------- |
| PolPoll |
19.1.2009, 16:20
Сообщение
#3
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Вот тут похожее http://www.opeople.ru/ipb.html?s=&showtopi...ndpost&p=186103
только без дополнительного кода и уже сразу в 2СС програмка на паскале http://www.opeople.ru/ipb.html?s=&showtopi...ndpost&p=169278 на похожую тему вот тут некоторая попытка объяснения была -------------------- |
| PolPoll |
19.1.2009, 16:38
Сообщение
#4
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Надо сложить два числа А и В, которые представлены в виде с плавающей точкой. Вот эти числа: [Ап] = +3; (порядок А) [Ам] = +0.9; (мантисса А) [Bп] = -1; (порядок В) [Bм] = +0.55; (мантисса) Самое непонятное: Разрядность модуля порядка должна быть равна 3, разрядность модуля мантиссы - 6 . Как это сделать? переводи в нормальный вид (без степени - как 0.000005 и 5000 в примерах) и переводи в 2СС потом будем по размерам мантиссы обрезать-округлять... -------------------- |
| Lady_Arvena |
22.1.2009, 20:52
Сообщение
#5
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Прошу прощения за небольшой перерыв (болела
Итак, вот что у меня получилось: Перевела дробь 0.9 в двоичную систему счисления: 111001, и, если я правильно понимаю, перед дробью (если переводится дробь) надо всегда ставить 0 с точкой... Тогда получается, что А (м) = 0.9 (10) = 0.111001. А (п) = 3 (10) = 011. В (п) = -1 (10) = -001. Вот, приведу пример, как я считала дроби (надеюсь, что это правильно): В (м) = 0.55 (10) = ? Считаю до 7 разрядов (там потом этот 7-й последний используется "для округления"..., честно говоря, не могу понять, зачем, и как это округление производить... Считаю: 2^-1 = 0.5, 0.5 < 0.55, значит первый разряд = 1, остаток = 0.05; 2^-2 = 0.25 > 0.05, значит второй разряд = 0; 2^-3 = 0.13, там тоже получается 0; 2^-4 = там тоже 0; 2^-5 = 0.03125 < 0.05, поэтому четв. разряд = 1, и остаток = 0.01875; 2^-6 = 0.01562 < 0.01875, поэтому пятый разряд = 1, и остаток = 0,003125; 2^-7 = 0.0078125 > 0,003125, поэтому седьмой разряд = 0, и его я просто опускаю. Интересно, что надо было бы делать в том случае, если бы седьмой разряд вышел 1? Как тогда надо было бы округлять? Значит, получилось число: В (м) = 0.55 (10) = 0.100011. Вот, пока и всё, что получилось... Надеюсь, я правильно поняла, что надо делать: то есть, отдельно переводить в двоичную систему счисления порядки и мантиссы, а потом их надо перевести в обратный код (вот тут пока понять не могу, как... |
| Lady_Arvena |
22.1.2009, 21:44
Сообщение
#6
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Цитата эти числа , наверно в 10СС? или в 16СС? Да, это числа в 10СС. То есть там по аналогии с предыдущим примером, заданы исходные значения в 10СС, только их надо перевести уже в двоичную систему счисления, а не в двоично-десятичную, и код для вычисления операции должен быть обратным (а не дополнительным). И ещё особенность в том, что надо провести всего одну операцию (сложение), и числа эти -- с плавающей запятой... Вот так, в целом |
| PolPoll |
24.1.2009, 17:45
Сообщение
#7
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
переводи в нормальный вид (без степени - как 0.000005 и 5000 в примерах) и переводи в 2СС Надеюсь, я правильно поняла, что надо делать: то есть, отдельно переводить в двоичную систему счисления порядки и мантиссы, а потом их надо перевести в обратный код (вот тут пока понять не могу, как... 50=0.5* 10^2 =/= 0.5* 2 ^2 = 2 -------------------- |
| Lady_Arvena |
25.1.2009, 17:50
Сообщение
#8
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Нет, не отдельно 50=0.5* 10^2 =/= 0.5* 2 ^2 = 2 0.9 * 10^3 = 900 / = 0.9 * 2^3 = 7.2; 0.55 * 10^-1 =0.055 / 0.55 * 2^-1 = 0.275 А дальше, как? Надо переводить эти получившиеся числа (7.2 и 0.275) в двоичную систему счисления? Или делать что-то другое? Сообщение отредактировал Lady_Arvena - 25.1.2009, 17:50 |
| PolPoll |
26.1.2009, 13:11
Сообщение
#9
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
неравенство написано, что б показать, что если отдельно переводить порядок и мантиссу, получится совсем другое число. Потому что основание сиситем счистления - разное (10 и 2)
надо переводить 0.9 * 10^3 = 900 в 2СС 0.55 * 10^-1 =0.055 -------------------- |
| Lady_Arvena |
26.1.2009, 16:44
Сообщение
#10
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
неравенство написано, что б показать, что если отдельно переводить порядок и мантиссу, получится совсем другое число. Потому что основание сиситем счистления - разное (10 и 2) надо переводить 0.9 * 10^3 = 900 в 2СС 0.55 * 10^-1 =0.055 Перевела: 900 - 512 (2^9) = 388 остаток, разряд = 1; 388-256 (2^8) = 132 остаток, разряд = 1; 132 - 128 (2^7) = 4 остаток, разряд = 1; 64 (2^6) => разряд = 0; 32 (2^5) => разряд = 0; 16 (2^4) => разряд = 0; 8 (2^3) => разряд = 0; 4 (2^2) => разряд = 1; 2 (2^1) => разряд = 0; 1 (2^0) => разряд = 0. И получилось: 900 (10) = 1110000100 (2). Так, как я переводила -- правильно? Дело в том, что во всех примерах смотрю -- перевод начинается с числа 2^8 = 256... В то же время, сказано, что начинать перевод надо с максимального числа, которое "влазит" в этот диапазон -- до 900. То есть, разрядность числа зависит от величины его модуля в десятичной СС? Если бы число было, скажем, 1300, то начинать вообще приходилось с 1024 = 2^10, и тогда разрядность числа в 2 СС была бы 11. Это так? Дальше перевожу дробь. Тут тоже, соответственно, ищу с точностью до 10 разрядов... У меня получилось: 0.055 (10) = 0. 000011100 (2). |
| PolPoll |
27.1.2009, 8:59
Сообщение
#11
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
И получилось: 900 (10) = 1110000100 (2). Так, как я переводила -- правильно? То есть, разрядность числа зависит от величины его модуля в десятичной СС? Если бы число было, скажем, 1300, то начинать вообще приходилось с 1024 = 2^10, и тогда разрядность числа в 2 СС была бы 11. Это так? Дальше перевожу дробь. Тут тоже, соответственно, ищу с точностью до 10 разрядов... У меня получилось: 0.055 (10) = 0. 000011100 (2). так мало. надо еще один знак - надо 6 знаков начиная с первой 1 но там 0 вроде дальше? ДАЛЬШЕ: сдвигай первое число вправо, второе влево и считай на сколько разрядов надо сдвинуть, чтобы первая 1 оказалась сразу после "запятой" полученное число переведешь в 2 СС - это и будет порядок и раскажи про доп код для дробных чисел, что-то не помню как его делать... -------------------- |
| Lady_Arvena |
27.1.2009, 18:17
Сообщение
#12
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Цитата мало. надо еще один знак - надо 6 знаков начиная с первой 1 Да, вот теперь ещё пересчитала по-новой: будет такое число (если считать аж до 2^-11): но там 0 вроде дальше? 0.055 (10) = 0. 0000111000 (2). Цитата сдвигай первое число вправо, второе влево и считай на сколько разрядов надо сдвинуть, чтобы первая 1 оказалась сразу после "запятой" полученное число переведешь в 2 СС - это и будет порядок Не знаю, куда сдвигать первое число... 900 (10) = 1110000100 (2). То есть, у него нет "запятой". Но, вот вроде, если записать так: 1110000100.0 -- то получается, что сдвигать надо в сторону этой точки -- и сдвигать надо на 2 разряда. Если я делаю всё правильно, то получим число 11100001.0 и сдвиг будет на 2 разряда, значит порядок = 2. Сдвигаю второе число (дробное) в левую сторону: 0. 0 0 0 0 111000 = 0. 111000 получается, до "запятой" надо убрать 4 нуля, значит, сдвинуть на 4 разряда... Получается, порядок = 4. Перевожу в 2СС: 2 = 0010; 4 = 0100; Если там требуемая "разрядность модуля порядка" должна быть = 3, то получается, что так будет выглядеть: 2 = 010; 4 = 100. Цитата и раскажи про доп код для дробных чисел, что-то не помню как его делать... Там код будет не дополнительный, там обратный надо делать. У меня, вот, собственно только и написано: Цитата Для случая правильной дроби запись числа В в обратном коде имеет вид: Вот [А]ок = 0. B, если B>=0; [А]ок = 1. (1-q^(-n) + B ), если B<0, где (1-q^(-n)) = максимальная включенная граница диапазона изменения представляемых чисел, т.е. диапазон изменение чисел А определяется как (1 - q^(-n)) >= |A| >= 0. Сообщение отредактировал Lady_Arvena - 27.1.2009, 18:28 |
| PolPoll |
28.1.2009, 9:07
Сообщение
#13
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Не знаю, куда сдвигать первое число... 900 (10) = 1110000100 (2). То есть, у него нет "запятой". Но, вот вроде, если записать так: 1110000100.0 -- то получается, что сдвигать надо в сторону этой точки -- и сдвигать надо на 2 разряда. Если я делаю всё правильно, то получим число 11100001.0 и сдвиг будет на 2 разряда, значит порядок = 2. Сдвигаю второе число (дробное) в левую сторону: 0. 0 0 0 0 111000 = 0. 111000 получается, до "запятой" надо убрать 4 нуля, значит, сдвинуть на 4 разряда... Получается, порядок = 4. Перевожу в 2СС: 2 = 0010; 4 = 0100; второе число - правильно, только порядок = -4 (отрицательный) Далее надо в каком-то порядке разместить все эти части - мантисса, порядок и их знаки в типе real, например мантисса порядок знак-порядка знак-мантиссы насколько помню... или может в "естественном " порядке надо? знак-мантиссы мантисса знак-порядка порядок -------------------- |
| Lady_Arvena |
28.1.2009, 15:33
Сообщение
#14
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Сдвигать на все 10 знаков, порядок = 10 (как в 3 разряда вместить не знаю Пусть есть целое число в 2СС... 1110000100 и как его сдвигать? Т.е., 0000000000. 1110000100, или просто это число, как все нули перезаписать? То есть, если число всё состоит из 10 разрядов, то как производить сдвиг? Цитата второе число - правильно, только порядок = -4 (отрицательный) А, если сдвигаем дробь, то порядок получится отрицательный, с этим поняла Цитата Далее надо в каком-то порядке разместить все эти части - мантисса, порядок и их знаки Вот, насчёт этого я ничего не знаю в типе real, например мантисса порядок знак-порядка знак-мантиссы насколько помню... или может в "естественном " порядке надо? знак-мантиссы мантисса знак-порядка порядок Там у меня нет привязки к каким-то конкретным типам, там просто тема "Арифметика с числами с плавающей точкой", ну, и с целью все эти примеры научиться считать. Не знаю, может ,в естественном порядке можно... Вот что про это удалось отрыть: Цитата Операция сложения чисел предполагает наличие одинаковых масштабов Негусто, но всё что есть складываемых величин. Для случая представления чисел с плавающей точкой это предполагает наличие одинаковых порядков у операндов, подлежащих суммированию. Поэтому при выполнении операции сложения чисел с плавающей точкой в общем случае должно быть реализовано три этапа: − выравнивание порядков; − сложение мантисс операндов, имеющих одинаковые порядки ; − определение нарушения нормализации и при необходимости её устранение. Сообщение отредактировал Lady_Arvena - 28.1.2009, 15:36 |
| PolPoll |
28.1.2009, 15:56
Сообщение
#15
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Эм-ммм... Вот этого, пока, всё-таки понять не получается. Пусть есть целое число в 2СС... 1110000100 и как его сдвигать? Т.е., 0000000000. 1110000100, или просто это число, как все нули перезаписать? То есть, если число всё состоит из 10 разрядов, то как производить сдвиг? Давай пример из 10 СС 12345 = 1234,5 * 10^1 = ... = 0.12345 *10^5 согласна, что равенство? Вот тоже самое и в 2СС, только такое смещение это степень двойки, а не 10 1110000100(2СС) = 0.1110000100(2СС) * 2^10(10СС) = 0.1110000100 * 2^1010(2СС) Далее Поскольку в мантиссе могут быть только 6 битов (у тебя условие такое в задаче), то последние значения отбрасываем = округляем число 1110000100 = 0.1110000100 * 2^10 округляем до 0.111000(2) * 2^1010 (2) и порядок переводим в 2СС + 0.111000(2) * 2^+1010 0(+) 111000(мантисса) 0(+) 1010(порядок) -------------------- |
| PolPoll |
28.1.2009, 16:03
Сообщение
#16
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
Второе число
0.0000111000 (2СС) = 0.111000(2CC) *2^-4(10CC) = + 0.111000(2CC) *2^-0100(2CC) 0(+) 111000(мантисса) 1(-) 0100(порядок) (тоже 4 разряда для порядка возьму, чтоб одинаково было...) здесь тоже присутствует округление - кстати там после 3 нулей не 1? может округлить в бОльшую сторону? -------------------- |
| Lady_Arvena |
28.1.2009, 16:16
Сообщение
#17
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Давай пример из 10 СС 12345 = 1234,5 * 10^1 = ... = 0.12345 *10^5 согласна, что равенство? Вот тоже самое и в 2СС, только такое смещение это степень двойки, а не 10 1110000100(2СС) = 0.1110000100(2СС) * 2^10(10СС) = 0.1110000100 * 2^1010(2СС) Цитата Далее да. Теперь вижу. Действительно, так... Хм, может быть, перевела я неправильно? 900 (10СС) в 2СС? Хотя, сейчас пересчитывала, вроде правильно. Поскольку в мантиссе могут быть только 6 битов (у тебя условие такое в задаче), то последние значения отбрасываем = округляем число 1110000100 = 0.1110000100 * 2^10 округляем до 0.111000(2) * 2^1010 (2) и порядок переводим в 2СС + 0.111000(2) * 2^+1010 0(+) 111000(мантисса) 0(+) 1010(порядок) Значит, возьмём 4 разряда, всё равно по-другому не получается Цитата здесь тоже присутствует округление - кстати там после 3 нулей не 1? может округлить в бОльшую сторону? Нет, вроде, там после третьего нуля (в конце) идёт ещё один 0... 0.00001110000, если считать до 2^11. |
| Lady_Arvena |
2.2.2009, 15:22
Сообщение
#18
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
PolPoll, а что делать дальше?
Я имею в виду, как дальше складывать эти числа? Значит, получились числа: 900 (10) = 1110000100 (2) 0.055 (10) = 0. 000011100 (2). потом, по заданию, надо сформировать для этих мантисс и порядков, переведённых в 2СС, прямые коды. Потом -- сформировать обратные; потом эти числа сложить (используя обратные коды); а потом снова результат представить в прямом коде и в нормализованной форме. Как это сделать? |
| PolPoll |
2.2.2009, 15:49
Сообщение
#19
|
![]() :) Группа: Главные администраторы Сообщений: 5 858 Регистрация: 24.11.2005 Из: Москва Пользователь №: 5 327 |
PolPoll, а что делать дальше? Я имею в виду, как дальше складывать эти числа? Значит, получились числа: 900 (10) = 1110000100 (2) 0.055 (10) = 0. 000011100 (2). потом, по заданию, надо сформировать для этих мантисс и порядков, переведённых в 2СС, прямые коды. Далее Поскольку в мантиссе могут быть только 6 битов (у тебя условие такое в задаче), то последние значения отбрасываем = округляем число 1110000100 = 0.1110000100 * 2^10 округляем до 0.111000(2) * 2^1010 (2) и порядок переводим в 2СС + 0.111000(2) * 2^+1010 0(+) 111000(мантисса) 0(+) 1010(порядок) Второе число 0.0000111000 (2СС) = 0.111000(2CC) *2^-4(10CC) = + 0.111000(2CC) *2^-0100(2CC) 0(+) 111000(мантисса) 1(-) 0100(порядок) (тоже 4 разряда для порядка возьму, чтоб одинаково было...) Потом -- сформировать обратные; потом эти числа сложить (используя обратные коды); от второго число при этом 0 останется число первое + 0 = первое число -------------------- |
| Lady_Arvena |
8.2.2009, 11:26
Сообщение
#20
|
![]() Пользователь Группа: Пользователи Сообщений: 52 Регистрация: 16.1.2009 Пользователь №: 21 326 |
Так. Вот это я сделала (раньше не могла из-за сессии
То есть тоже вот так получилось: Первое число: + 0.111000(2) * 2^+1010 0(+) 111000(мантисса) 0(+) 1010(порядок) Второе число: 0(+) 111000(мантисса) 1(-) 0100(порядок) Только не могу понять, зачем тут нули? Вот эти, перед плюсом: 0(+) 111000? То есть, получили мантиссы и порядки как бы "заново". А потом, ты говорила: Цитата Далее надо в каком-то порядке разместить все эти части - мантисса, порядок и их знаки Честно говоря, ничего не могу об этом найти... в типе real, например мантисса порядок знак-порядка знак-мантиссы насколько помню... Это надо делать сразу после того, как перевели числа? Или уже для сформированных кодов (обратного и прямого) приводишь оба числа к одному порядку - большему (+1010(2)) от второго число при этом 0 останется И ещё вот, наша что-то по поводу сложения чисел с плавающей точкой: Код 1) числа приводятся к одинаковому значению экспоненты; У нас в примере надо делать первый пункт? (А то что-то не очень могу понять, как конкретно каждый пункт делается... 2) складываются получившиеся мантиссы; 3) результат нормализуется вот |
![]() ![]() |
|
Текстовая версия | Сейчас: 23.5.2012, 4:03 |