Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_1_метод_указания прога.doc
Скачиваний:
3
Добавлен:
03.11.2018
Размер:
301.57 Кб
Скачать

Операции умножения и деления

При умножении и делении вещественных чисел процессор выполняет следующие действия:

  • находит произведение (или частное от деления) мантисс

  • вычисляет сумму (разность) порядков операндов

  • нормализует мантиссу результата, если это необходимо

  • выполняет соответствующую корректировку порядка результата, если это необходимо.

При этом возможно возникновение некоторых «особых» ситуаций, как последствий действий процессора.

Ошибки округления

Из-за ограниченности разрядов под представление мантиссы при выполнении операций умножения и деления возможен «выход» значения мантиссы за разрядную сетку (в случае произведения мантисса содержит больше разрядов, чем допустимо внутренним представлением данных соответствующего типа, поэтому часть младших разрядов произведения в память не записывается; при делении операция выполняется до получения нулевого промежуточного частного или до заполнения бит мантиссы результата). Например, пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок. Тогда при умножении двух чисел 0.123*1002 и 0.161*1005 имеем:

0.123*1002 * 0.161*1005 = 0.019803*1007 = 0.198*1006 = 198000 (вместо ожидаемого 198030), т.е. имеем ошибку округления.

Как следствие, надо помнить, что для вещественных чисел X и Y значения выражений X и X*Y/Y не равны. Например:

0.111*1000*0.223*1001/0.223*1001=0.025*1001/0.223*1001=0.25*1000/0.223*1001= 1.121*10-01 = 0.112*1000.

#include <conio.h>

#include <stdio.h>

int main()

{float a,b;

b=2.0e20 + 1.0;

a=b-2.0e20;

printf ("%f\n", a);

b=2.0e4 + 1.0;

a=b-2.0e4;

printf ("%f\n", a);

_getch();

return 0;

}

Результат:

4008175468544.000000

1.000000

#include <conio.h>

#include <stdio.h>

int main()

{double a,b;

b=2.0e20 + 1.0;

a=b-2.0e20;

printf ("%f\n", a);

b=2.0e4 + 1.0;

a=b-2.0e4;

printf ("%f\n", a);

_getch();

return 0;

}

Результат:

0.000000

1.000000

Переполнение (ошибка переполнения)

Пусть для представления вещественного числа также выделено 3 двоичных разряда под мантиссу и 2 – под порядок. Тогда при умножении двух чисел 0.823*1046 и 0.101*1065 имеем:

0.823*1046 * 0.101*1065 = 0.83123*10** , т.к. значение порядка 111 выходит за отведенные ему 2 разряда, т.е. имеем ошибку переполнения.

Потеря порядка (ошибка исчезновения порядка)

При выполнении операций умножения и деления вещественных чисел из-за ограниченности разрядов под представление мантиссы и порядка числа может возникнуть ситуация появления «машинного нуля». «Машинный нуль» - это число с ненулевой мантиссой и порядком меньшим, чем минимальный порядок в данном типе. Иногда для характеристики данной ситуации употребляют выражение «0 в случае выполнения арифметических операций над вещественными числами представляется обособленно». Например, пусть для представления вещественного числа выделено 3 разряда под мантиссу и 2 под порядок. Тогда при делении двух чисел 0.425*10-27 и 0.561*1078 имеем:

0.425*10-27/0.561*1078 = 0.0757575…*10-105 = 0.757575…*10-106 = 0, т.е. все значения с порядком, меньшим чем (-99) будут восприниматься как «машинный нуль» – это и есть ошибка исчезновения (потери) порядка.