Лекция 9. Двоичная арифметика и проблема точности вычислений Краткое содержание 1. Двоичная система счисления: целые числа и дроби 2. Восьмеричная система счисления 3. Числа с фиксированной и плавающей запятой 4. Формат IEEE-754, машинный эпсилон 5. Численное дифференцирование
Позиционная система счисления В позиционной системе счисления значение цифры (знака) зависит от разряда, в котором она находится Десятичная система счисления Двоичная система счисления Целая часть Дробная часть Основание с.с. Бит – двоичный разряд Целая часть Дробная часть Основание с.с. Разряды
Перевод в двоичную систему счисления: целые Алгоритм 1. Разделить число на 2 с остатком 2. Остаток – двоичный разряд числа, записать его слева от уже выписанных разрядов 3. Если целая часть – 0, то закончить, иначе перейти к шагу 1 Пример 1: / 2 = 21 ост 0 21 / 2 = 10 ост 1 10 / 2 = 5 ост 0 5 / 2 = 2 ост 1 2 / 2 = 1 ост 0 1 / 2 = 0 ост 1 Ответ: Проверка: = = = 42 В десятичной системе 1023 / 10 = 102 ост / 10 = 10 ост 2 10 / 10 = 1 ост 0 1 / 10 = 0 ост 1 Пример 2: / 2 = 8 ост 0 8 / 2 = 4 ост 0 4 / 2 = 2 ост 0 2 / 2 = 1 ост 0 1 / 2 = 0 ост 1 Ответ:
Перевод в двоичную систему счисления: дроби Алгоритм (для чисел
Шестнадцатеричная и восьмеричная системы счисления ЦифраDECBINЦифраDECBIN A B C D E F Шестнадцатеричные цифры Системы счисления с основанием 8 и 16 соответственно. Восьмеричная цифра содержит 3 бита, шестнадцатеричная – 4. Внимание! При переводе чисел между двоичной, восьмеричной и шестнадцатеричной системами счисления не пользуйтесь десятичной в качестве промежуточной! Двоичная ощутимо удобнее в этом случае!
Числа с плавающей запятой Числа с фиксированной запятой 1. Фиксированное количество разрядов 2. Фиксированное положение запятой (разделителя целой и дробной части) Числа с плавающей запятой 1. Деление числа на мантиссу и порядок 2. Фиксированное количество разрядов в мантиссе Примеры Примеры ( )*10 0 ( )*10 2 ( )*10 -2 ( )*10 -4 В случае чисел с фиксированной запятой постоянна абсолютная погрешность В случае чисел с плавающей запятой постоянна относительная погрешность
Числа с плавающей запятой: формат IEEE-754 Тип double (8 байт) |seeeE|EM|MM|MM|MM|MM|MM|MM| Всего – 64 бита (8 байт) Знак – 1 бит Порядок – 11 бит Мантисса – 52 бита Особенности формата 1.Знак: 0 – «плюс», 1 – «минус» 2.Порядок: хранится в виде суммы с числом 1023 ( ) 3.Мантисса: старший разряд – всегда единица и опускается 4.0 кодируется особым образом Отображение в Octave >> format hex; После этого все числа будут выводиться в шестнадцатеричном виде и формате IEEE-754
Числа с плавающей запятой: формат IEEE-754 Особые случаи: >> format hex; >> 0 ans = Все биты – 0 >> +Inf ans = 7ff Биты мантиссы – 0, биты порядка - 1 >> -Inf ans = fff Биты мантиссы – 0, биты порядка - 1 >> NaN ans = 7ff Биты мантиссы – не все 0, биты порядка - 1 Примечание: при работе с форматом IEEE-754 с помощью прямого доступа к ячейкам памяти (например, в языках Си и Ассемблер) помните о Little Endian/Big Endian! Little Endian – на x86 процессорах Big Endian – на PowerPC процессорах
Числа с плавающей запятой: погрешности Пример 2: сумма чисел >> a = 0.1; s = 0; >> for i=1:10000; s = s + a; end; >> s s = >> a = 0.125; s = 0; >> for i=1:10000; s = s + a; end; >> s s = 1250 >> s – 1250 ans = 0 В первом случае накапливаются ошибки округления (т.к. 1/10 – бесконечная периодическая дробь), а во втором – нет (т.к. 1/8 имеет точное представление)
Численное дифференцирование Погрешность формулы Погрешность округления Суммарная погрешность
Численное дифференцирование dx = 10.^(-16:0.05:0); x = 3; % Variant 1 %dx = 2.^(-52:1:1); x = 3; % Variant 2 df = ((x + dx).^2 - x.^2)./ dx; Ddf = abs(df - 2*x); Ddf_theor = 4*eps*x.^2./dx + dx; loglog(dx,Ddf,'r-','LineWidth',2,... dx,Ddf_theor,'b-', 'LineWidth', 2); xlabel('\Delta{x}'); ylabel('\Deltaf'''); Variant 1 Variant 2