| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |