|
Вопрос # 3 962/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Есть формула , например Y=a*b+c;
1) Считаем сколько получаєтся Y - это я сделал и сам =)
2)Надо умножить (в даном примере) a*b и сложить с c, но
при умножатся результат должен вмещятся :
1) в 8 битовую переменную
2) в 16 битовую переменную
Тоже самое при сложении, только тут надо учесть еще и переполнение.
Тоесть надо 4 результата:
x1= a*b (8 бит)
x2= a*b (16 бит)
x3= a*b+с (8 бит)
x4= a*b+с (16 бит)
Мне в конце надо найти разницу между Y - если эго просто посчитать и Y1,Y2 - если есть ограничение в битах при расчете.
Я просто с типами ужасно путаюсь.
 |
Вопрос задал: hatecows (статус: Посетитель)
Вопрос отправлен: 1 апреля 2010, 21:53
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
А ты не путайся.
Есть такая байда как приведение типов. Для начала задайся по максимуму (от нужного, а не от возможного):
var
Y: Integer; // Ну, уж если ваще припрёт, то Int64
Y1: Word; // 16 бит без знака
Y2: SmallInt; // 16 бит со знаком
Y3: Byte; // 8 бит без знака
Y4: ShortInt; // 8 бит со знаком
Далее просто вычисли Y и присвой его остальный переменным. Компилятор сам обрежет результаты под нужный тип. Если включен Range checking, то можно опять же тупо привести тип:
Y:= a * b + c;
Y1:= Word(Y);
Y2:= SmallInt(Y);
// и т.д.
А потом и получишь разницу, вычитая одно из другого.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 1 апреля 2010, 22:08
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 2 апреля 2010, 12:55; участников в обсуждении: 2.
|
hatecows (статус: Посетитель), 1 апреля 2010, 22:05 [#1]:
а,и еще, совсем забыл, думаю это важно.
a и b - типа real,тоесть их надо будет както конвертировати.
|
|
min@y™ (статус: Доктор наук), 1 апреля 2010, 22:10 [#2]:
Цитата (hatecows):
а,и еще, совсем забыл, думаю это важно. a и b - типа real,тоесть их надо будет както конвертировати.
Ну ЁПРСТэээ!
Y какого типа должен быть-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
hatecows (статус: Посетитель), 1 апреля 2010, 22:21 [#3]:
Извени- я может не правильно пояснил.
Смотри.
Пусть функция приведения в 8 -бит будет Prev8;
В норм случае : Y=a*b+c
В случаи с 8-битами должно быть : Y= Prev8(Prev8(a*b )+c));
Только a, b,с например такие - 5.765674565...
|
|
min@y™ (статус: Доктор наук), 1 апреля 2010, 22:28 [#4]:
Цитата (hatecows):
Извени- я может не правильно пояснил. Смотри. Пусть функция приведения в 8 -бит будет Prev8; В норм случае : Y=a*b+c В случаи с 8-битами должно быть : Y= Prev8(Prev8(a*b )+c)); Только a, b,с например такие - 5.765674565...
Блин, какого типа должен быть Y?!!! Это что, военная тайна?!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
hatecows (статус: Посетитель), 1 апреля 2010, 22:30 [#5]:
Y- типа real.
|
|
min@y™ (статус: Доктор наук), 1 апреля 2010, 22:35 [#6]:
Цитата (hatecows):
Y- типа real.
Тогда о каких 8 битах может идти речь? Переменная типа Real занимает 8 байт (64 бита). Есть, конечно, Real48 (6 байт), который добавлен для совместимости со старыми версиями. Самый мелкий вещественный тип - это Single (4 байта = 32 бита).
А вот теперь колись давай: чего ты хочешь-то, ёмаё?!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
hatecows (статус: Посетитель), 2 апреля 2010, 10:06 [#7]:
Чесно говоря - я тебе стоя опладтрую, я б уже не выдержал =)
Щя попробую разжевать,так чтоб и я сам понял )))))
Если ,например, два числа 5,3543536576 и 3.245654567 умножить будет 17.3783824021225942592.
Но результат должен помещятся в переменную (не знаю уже какого типа) которая может содержать только 8 бит, тоесть , например только 8 значущих цыфр-тогда число 17.3783824021225942592 надо будет округлить = 17.378382 или откинуть остальние цифры = 17.378382. И при этом исчезает точность.
Если взять Y=a*b*c*d, то при каждой операции умножения результат будет неточний- обрезаний, поетому Y и Y1(обрезаний) - не будут равны.
Тоже при сложении. Когда два числа складивать-может быть переполнение 8-битной сетки, и это тоже надо как-то учесть.
В конечном итоге Y=a*b+c не будет равен Y1:a*b+c.
А с типами я уже все...потерялся, можешь и другой взять - я Y потом сам форматну в нужный.
|
|
min@y™ (статус: Доктор наук), 2 апреля 2010, 10:37 [#8]:
Задаю 3 наводящих вопроса:
- Что такое бит?
- Что такое значащие цифры?
- Чем байда №1 отличается от байды №2?
А для округления до N-го (десятичного!) знака после точки есть функция RoundTo().
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
hatecows (статус: Посетитель), 2 апреля 2010, 11:36 [#9]:
Вот например кусок пояснения из задания:
В цифровой обработке используются операции умножения, сложения и сдвига. Их выполнение приводит к необходимости расширения разрядной сетки. Например, перемножения двух b-разрядных чисел приводит к 2b-разрядного результата, дальнейшее перемножения может привести к бесконечному увеличению разрядной сетки. Для преодоления эффекта применяют квантования результатов умножения к исходной b-разрядной сетки с закруглением или отвержением младших разрядов. При этом возникает шум округления.
При добавлении, в общем случае расширения разрядной сетки не возникает, но в некоторых случаях может возникнуть переполнение. Для преодоления этого эффекта применяют сдвиг результатов вправо и его квантования. Для квантования результатов умножения и сложения применяют округление или отбрасывание, в зависимости от требований реализации. Погрешности, возникающие при этом будут иметь случайный характер.
3. Байда №1 - считается без ограничения разрядной сетки, Байда №2 - с ограничнием(поэтому будет неточная - изза округления и отбрасывания).
|
|
min@y™ (статус: Доктор наук), 2 апреля 2010, 12:55 [#10]:
Понятно, ты не знаешь, чем отличается бит от десятичного разряда и как хранятся в памяти числа с плавающей точкой. Ты, хоть, вообще представляешь, что все числа хранятся в двоичном виде или нет?
Срочно читай статью Антона Григорьева "Неочевидные особенности вещественных чисел".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|