Чем отличается компьютерная арифметика от обычной почему кратко

Обновлено: 05.07.2024

На уроках математики вы никогда не обсуждали, как хранятся числа. Математика — это теоретическая наука, для которой совершенно не важно, записаны они на маленьком или большом листе бумаги, зафиксированы с помощью счётных палочек, счётов, или внутри полупроводниковой схемы. Поэтому число в математике может состоять из любого количества цифр, которое требуется в решаемой задаче.
В то же время инженеры, разрабатывающие компьютер, должны спроектировать реальное устройство из вполне определённого количества деталей. Поэтому число разрядов, отведённых для хранения каждого числа, ограничено, и точность вычислений тоже ограничена. Из-за этого при компьютерных расчётах могут возникать достаточно серьёзные проблемы. Например, сумма двух положительных чисел может получиться отрицательной, а выражение А + В может совпадать с А при ненулевом В. В этой главе мы рассмотрим важные особенности компьютерной арифметики, которые нужно учитывать при обработке данных. В первую очередь, они связаны с тем, как размещаются целые и вещественные числа в памяти компьютера.

Предельные значения чисел
Как вы уже поняли, числа, хранящиеся в компьютере, не могут быть сколь угодно большими и имеют некоторые предельные
значения. Представим себе некоторое вычислительное устройство,
которое работает с четырехразрядными неотрицательными целыми десятичными числами (рис. 4.1). Для
вывода чисел используется четырёх разрядный индикатор, на котором можно
отобразить числа от 0 (все разряды числа
минимальны) до 9999 (все разряды максимальны) — рис. 4.2.

Сmax=В К -1.
Именно эта формула для В = 2 неоднократно применялась в главе 2.
Подчеркнем, что переполнение никак не связано с системой счисления: оно вызвано ограниченным количеством разрядов устройства и не зависит от количества возможных значений в каждом из этих разрядов.
Рассмотрим теперь, что получится, если наше устройство будет работать не только с целыми, но и с дробными числами. Пусть, например, один из четырёх разрядов относится к целой части числа, а остальные три — к дробной (рис. 4.3). Конечно, эффект переполнения сохранится и здесь: максимально допустимое число равно 9,999.

1Докажите эту формулу самостоятельно, например, подсчитав количество всех возможных комбинаций значений цифр в К разрядах.

Кроме того , дробная часть числа тоже ограничена, поэтому любое число, имеющее более трёх цифр после запятой, не может быть представлено точно: младшие цифры придётся отбрасывать (или округлять).

Не все вещественные числа могут быть представлены в компьютере точно.



что обеспечивает единственность представления (1.1). Любое вещественное число можно представить в форме с плавающей точкой, и это может быть сделано в любой системе счисления с основанием b > 0. Однако некоторые вещественные числа (например, иррациональные) невозможно записать в оперативную память компьютера точно. Все числа, которые могут быть помещены в оперативную память, представляются в определенном виде. При этом их характеристики ограничены: ст 4 , тогда характеристика с, согласно (1.1), равна 4 (100 в двоичной форме). Дробная часть числа представляется в виде



тогда коэффициенты ап равны

Для простоты числа, которые могут быть помещены в оперативную память, мы будем называть машинными числами, и они образуют конечное подмножество множества вещественных чисел. Для описания машинных чисел мы ввели параметры b, стп, ср и ky но использовать эти параметры на практике не очень удобно. Обычно для описания машинных чисел вводится другой набор параметров: b, 8q, S, и 8оо. Эти параметры, как и предыдущие, зависят от конкретного компьютера и определяются следующим образом:



Эти параметры имеют следующие значения: 8оо — максимальное машинное число, 8о — минимальное машинное число и есть минимальное расстояние между двумя машинными числами на интервале от 1 до Ь. Параметр ej также называют относительной ошибкой определения единицы, так как все числа вида 1 + х из интервала [1, 1 + Sj] заменяются машинным числом 1 с ошибкой, не превосходящей et. Следовательно, интервалы (-°°, -Soo), (-ео> 0), (0, 8q), (1 - 8j/b, 1), (1, 1 + 8t) и (Coo, °°) не содержат машинных чисел. Наряду со стандартной точностью существует возможность более точного представления машинных чисел. Это можно осуществить, увеличив число цифр в мантиссе и расширив область допустимых значений характеристик. Тогда машинные числа с повышенной точностью будут определяться некоторыми параметрами



Например, определяющие параметры для PC представлены в табл. 1.1.

Определяющие параметры для PC

Если число х е [-8оо, ?«>], то оно заменяется машинным числом хт. В процессе такой замены используется какой- нибудь способ приближения (усечение или округление) и в качестве хт выбирается ближайшее к х число. В результате такой замены возникает ошибках — хт. Для е0 эта ошибка оценивается величиной 8j|x|, т.е. х - хт тогда хт может принимать одно из двух значений: 0 или 80, и понятно, что в обоих случаях х - хт ].

На компьютерах арифметические операции выполняются над машинными числами. Во многих случаях результат этих операций может не быть машинным числом или, другими словами, результат арифметической операции (машинный результат), будучи машинным числом, может не совпадать с точным результатом. Например, для точного представления частного двух машинных чисел а и b часто требуется бесконечное количество цифр мантиссы. Поэтому машинный результат отличается от точного результата деления а и Ь. Для дальнейшего анализа мы введем следующее правило компьютерной арифметики: машинный результат арифметической операции над двумя машинными числами можно представить как результат записи точного значения этой операции в память компьютера. Для того чтобы отличать машинные операции от обычных (точных) операций, мы будем обозначать их таким же знаком в угловых скобках. Тогда, согласно принятому выше правилу, можно записать



Формулы (1.3) имеют следующий смысл: машинный результат арифметической операции есть ближайшее к точному результату машинное число. Машинный результат также зависит от типа операции и чисел а и Ь. Например, если точный результат лежит вне итервала допустимых в компьютере чисел (результат не принадлежит [-?оо, ?оо]), то мы сталкиваемся с ситуацией, называемой переполнением порядка. Эту ситуацию компьютер трактует как фатальную ошибку, и дальнейшие вычисления прекращаются. В правильно работающей программе такие ситуации должны быть исключены. Если абсолютное значение точного результата меньше чем ?q, то возникает ситуация, называемая исчезновением порядка, и хотя это не является фатальной ошибкой такая ситуация также нежелательна.

Объединяя выражения (1.2) и (1.3), мы получим формулы для моделирования ошибок арифметических операций



Эти формулы приводят к следующей оценке для ошибки, возникающей при выполнении операций с плавающей точкой:

Некоторые авторитетные ученые в области вычислительной техники утверждают, что есть арифметика и есть компьютерная арифметика. Мне показалось это странным. И чем глубже я начал вникать в проблемы компьютерной арифметики, тем отчетливее стал понимать, что произошла некоторая путаница в представлениях.

Сначала я думал, что вся проблема в ограниченности разрядности представления двоичных и десятичных чисел, связанная с конечностью операционных регистров компьютера. Об этом говорят многие авторы, пишущие об этой проблеме. Но такое ограничение не выводит компьютерные вычисления за рамки классической арифметики с ограниченным числом цифр. Теория приближенных вычислений дает нам хорошо изученные инструменты для работы с такими числами. И нет никакой разницы, в какой из систем счисления выполняются вычисления.

Так в чем же отличие компьютерной арифметики от арифметики классической? А отличие состоит в том, что в компьютере десятичные вычисления выполняются в двоичной арифметике. Десятичную арифметику в BCD-кодах мы здесь не рассматриваем. При этом на входе вычислительного устройства входные данные задаются в десятичном виде с определенной заданной точностью (количеством значащих цифр) и результат вычислений мы тоже оцениваем в десятичном виде. Все вычисления в компьютере выполняются не над десятичными числами, а над их двоичными представлениями. Причем точность двоичного представления определяется количеством разрядов операционных регистров компьютера.

Таким образом, мы должны говорить не о десятичной или двоичной компьютерной арифметике, а о десятично-двоичной. И здесь кроется большая проблема, т.к., как известно, десятичная и двоичная системы счисления несоизмеримы.

В целочисленной арифметике двоичные и десятичные числа взаимно-однозначны. Когда же идет речь о числах с дробной составляющей, т.е. о вещественных числах, то все становится гораздо хуже. При вычислении в одном конкретном базисе (системе счисления) , если мы пользуемся правилами приближенных вычислений, мы получаем правильный результат, как для десятичных, так и для двоичных дробных чисел. Например, в десятичной арифметике – 0.12+ 0.121 ≈ 0.24, в двоичной – 0.101+0.1=1.001≈1.01. И это правильные результаты.

Если же нам надо вычислить, например, сумму 0.12+ 0.1 в десятично-двоичной арифметике, то мы должны представить эти десятичные числа в двоичном виде – 0.12 = 0.000111101011…, 0.1 = 0.000110011001… . Каждое двоичное представление наших десятичных чисел имеет бесконечное число цифр и поэтому точной десятичной суммы мы никогда не получим, сколько бы двоичных цифр мы ни брали. Так, вычисленная по правилам двоичной арифметики, сумма восьмиразрядных двоичных представлений наших десятичных чисел даст 0.00011110110 + 0.000110011010= 0.00111000011. В результате округления двоичного значения суммы до 8 значащих цифр мы получим число 0.0011100010, которое равно десятичному числу 0.220703125. Это число является представимым и оно является ближайшим числом, к которому было округлено двоичное число 0.00111000011.

А теперь, самое главное. Правила приближенных вычислений требуют после каждой математической операции оставлять только фиксированное количество верных цифр. Неверные цифры в числах приводят к неточным, а иногда и вовсе к ошибочным результатам. Последний случай особенно часто встречается при вычитании близких по значению чисел.

Для десятичных и двоичных чисел, неверные цифры, это те, которые расположены сразу за верными цифрами справа. В процессе десятично-двоичных вычислений мы вынуждены округлять двоичные числа до разрядности операционных регистров компьютера. Таким образом, мы отбрасываем те двоичные цифры, которые не участвуют при дальнейших вычислениях . Двоичные вычисления ведутся с точностью до разрядности операционных регистров компьютера. Но нас интересуют десятичные результаты вычислений с точностью до заданного количества десятичных цифр. Тривиальное округление двоичного представления десятичного числа не дает правильного десятичного округления этого числа до заданного количества десятичных цифр. Оно дает наилучшее приближение к ближайшему представимому числу, которое часто не является ближайшим к правильно округленному десятичному числу, представленному в двоичном виде.

Если обозначить через ◦[…] операцию округления, то ◦[0.0011100000]=◦[ 0.0011100010]= 0.0011100001. Следовательно ◦[0.0011100000] — ◦[0.0011100010] = 0. Таким образом, разность правильно округленных двоичных чисел дает строгий нуль. Следовательно, сравнение на равенство двух правильно округленных чисел становится тривиальной задачей. Упрощается также решение и ряда других задач, сложность которых обусловлена концепцией аппроксимации десятичных чисел двоичными кодами принятой в стандарте IEEE754. Суть этой концепции в том, что точность аппроксимации десятичных чисел определена количеством разрядов мантиссы двоичного числа, которое аппроксимирует заданное десятичное число.

Предлагаемый здесь подход позволяет существенно сократить разрядность операционных регистров в процессоре для заданной десятичной точности вычислений. А также избавиться от громоздких алгоритмов, призванных уменьшить ошибки в двоичных вычислениях для десятичных чисел. От компьютерной арифметики мы возвращаемся к обычной арифметике с числами ограниченной размерности.

В заключение отметим, что описанный выше подход к представлению десятичных чисел двоичными числами ограниченной разрядности в десятично-двоичных расчетах устраняет проблемы с ошибками аппроксимации и их влиянием на результаты вычислений, но при этом проблемы десятичной арифметики для чисел ограниченной разрядности никуда не деваются.

Юрий Спиридонов

Я изобретатель, имею 18 авторских свидетельств СССР на изобретения и два патента. Последние несколько лет занимаюсь исследованием проблем компьютерной математики.

Вопрос по информатике:

Чем отличается компьютерная арифметика от обычной? Примеры

Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?

Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок - бесплатно!

  • 16.09.2018 20:59
  • Информатика
  • remove_red_eye 4860
  • thumb_up 43
Ответы и объяснения 1

Если речь о результатах, то в компьютерной арифметике числа представляются в двоичном коде, а точность их представления обычно ограничена разрядностью процессора. Для проведения расчетов с неограниченной точностью используются специальные алгоритмы с представлением чисел в виде символьных строк.
При использовании двоичной арифметики приходится сталкиваться с тем, что большинство нецелых чисел невозможно точно представить в двоичной системе, как нельзя, например, в десятичной системе точно представить в виде десятичной дроби число 1/3 = 0.333.
Рассмотрим пример. Если в простых дробях (1/3) х 3 = 1, то в десятичных 0.3333 х 3 = 0.9999.
В двоичной машинной арифметике происходит аналогичная ситуация. Но если человек сознает, что результат 0.9999. - та же единица, то компьютер этого не понимает. В результате в компьютерной арифметике (1 / 3) х 3 не равняется единице.
Еще пример. Пусть нам надо вычислить значение функции в точках от -2π до 2π с шагом π/6. Человек будет использовать значения -2π, -11π/6, -10π/6 и т.д. пока не придет к точке 2π. Компьютер (в арифметике с обычной точностью) вычислит значение -2π как -6.283185, а шаг представит значением 0.5235988. Это приведет к тому, что когда мы придем к нулю, то получим значение аргумента -9.536743х10⁻⁷, а в конечной точке получим аргумент 6.283184, который по абсолютной величине отличается от начального на единицу в младшей цифре, т.е. для компьютера при таком последовательном счете |-2π| ≠ 2π.
Третий пример. отрицательные целые числа представляются в компьютере в дополнительном коде, когда старший разряд является знаковым: 0 - это плюс, 1 - это минус.
Пусть мы прибавляем к 127 единицу в арифметике целых чисел, которым в двоичном представлении отведен один байт:
1111111₂ + 1₂ = 10000000₂ - тут все понятно, единичка перешла в старший, восьмой разряд. Но ведь он ЗНАКОВЫЙ! И вместо двоичного эквивалента 128 в компьютерной арифметике мы получаем отрицательное число! Причем, что самое интересное, из соображений эффективности эта ситуация обычно аппаратно не контролируется и в результате программы могут вести себя очень странно.

Знаете ответ? Поделитесь им!

Как написать хороший ответ?

Чтобы добавить хороший ответ необходимо:

  • Отвечать достоверно на те вопросы, на которые знаете правильный ответ;
  • Писать подробно, чтобы ответ был исчерпывающий и не побуждал на дополнительные вопросы к нему;
  • Писать без грамматических, орфографических и пунктуационных ошибок.

Этого делать не стоит:

Есть сомнения?

Не нашли подходящего ответа на вопрос или ответ отсутствует? Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие вопросы в разделе Информатика.

Трудности с домашними заданиями? Не стесняйтесь попросить о помощи - смело задавайте вопросы!

Информатика — наука о методах и процессах сбора, хранения, обработки, передачи, анализа и оценки информации с применением компьютерных технологий, обеспечивающих возможность её использования для принятия решений.

Если речь о результатах, то в компьютерной арифметике числа представляются в двоичном коде, а точность их представления обычно ограничена разрядностью процессора. Для проведения расчетов с неограниченной точностью используются специальные алгоритмы с представлением чисел в виде символьных строк.
При использовании двоичной арифметики приходится сталкиваться с тем, что большинство нецелых чисел невозможно точно представить в двоичной системе, как нельзя, например, в десятичной системе точно представить в виде десятичной дроби число 1/3 = 0.333.
Рассмотрим пример. Если в простых дробях (1/3) х 3 = 1, то в десятичных 0.3333 х 3 = 0.9999.
В двоичной машинной арифметике происходит аналогичная ситуация. Но если человек сознает, что результат 0.9999. - та же единица, то компьютер этого не понимает. В результате в компьютерной арифметике (1 / 3) х 3 не равняется единице.
Еще пример. Пусть нам надо вычислить значение функции в точках от -2π до 2π с шагом π/6. Человек будет использовать значения -2π, -11π/6, -10π/6 и т.д. пока не придет к точке 2π. Компьютер (в арифметике с обычной точностью) вычислит значение -2π как -6.283185, а шаг представит значением 0.5235988. Это приведет к тому, что когда мы придем к нулю, то получим значение аргумента -9.536743х10⁻⁷, а в конечной точке получим аргумент 6.283184, который по абсолютной величине отличается от начального на единицу в младшей цифре, т.е. для компьютера при таком последовательном счете |-2π| ≠ 2π.
Третий пример. отрицательные целые числа представляются в компьютере в дополнительном коде, когда старший разряд является знаковым: 0 - это плюс, 1 - это минус.
Пусть мы прибавляем к 127 единицу в арифметике целых чисел, которым в двоичном представлении отведен один байт:
1111111₂ + 1₂ = 10000000₂ - тут все понятно, единичка перешла в старший, восьмой разряд. Но ведь он ЗНАКОВЫЙ! И вместо двоичного эквивалента 128 в компьютерной арифметике мы получаем отрицательное число! Причем, что самое интересное, из соображений эффективности эта ситуация обычно аппаратно не контролируется и в результате программы могут вести себя очень странно.

Если числа натуральные, то они не только неотрицательны, - они все положительны, поскольку начинаются с единицы. Посему проверка на отрицательность делаться не будет - ввод чисел меньше 1 противоречит условию задачи.

Вариант 1. Без операторов цикла.
var
a,b,c,d:integer;
begin
Write('Введите 4 натуральных числа: ');
Read(a,b,c,d);
if a mod 2=0 then Writeln('Корень из ',a,' равен ',sqrt(a));
if b mod 2=0 then Writeln('Корень из ',b,' равен ',sqrt(b));
if c mod 2=0 then Writeln('Корень из ',c,' равен ',sqrt(c));
if d mod 2=0 then Writeln('Корень из ',d,' равен ',sqrt(d));
end.

Пример решения
Введите 4 натуральных числа: 3 8 16 12
Корень из 8 равен 2.82842712474619
Корень из 16 равен 4
Корень из 12 равен 3.46410161513775

Вариант 2. С оператором цикла.
var
i,n:integer;
begin
for i:=1 to 4 do begin
Write('Введите натуральное число: ');
Read(n);
if n mod 2=0 then Writeln('Корень из ',n,' равен ',sqrt(n))
end
end.

Пример решения
Введите натуральное число: 3
Введите натуральное число: 8
Корень из 8 равен 2.82842712474619
Введите натуральное число: 16
Корень из 16 равен 4
Введите натуральное число: 12
Корень из 12 равен 3.46410161513775

Вариант 3. С массивами
var
i:integer;
a:array[1..4] of integer;
begin
Write('Введите 4 натуральных числа: ');
for i:=1 to 4 do Read(a[i]);
for i:=1 to 4 do
if a[i] mod 2=0 then Writeln('Корень из ',a[i],' равен ',sqrt(a[i]))
end.

Пример решения
Введите 4 натуральных числа: 3 8 16 12
Корень из 8 равен 2.82842712474619
Корень из 16 равен 4
Корень из 12 равен 3.46410161513775

Читайте также: