- Представление чисел с плавающей точкой
- Содержание
- Плавающая точка [ править ]
- Нормальная и нормализованная формы [ править ]
- Числа двойной точности [ править ]
- Свойства чисел с плавающей точкой [ править ]
- Особые значения чисел с плавающей точкой [ править ]
- Ноль (со знаком) [ править ]
- Бесконечность (со знаком) [ править ]
- Неопределенность [ править ]
- Денормализованные числа [ править ]
- Машинная эпсилон [ править ]
- Unit in the last place (Unit of least precision) [ править ]
- Погрешность предиката «левый поворот» [ править ]
- Определения [ править ]
- Расчет [math] \tilde <\epsilon>[/math] [ править ]
- Ответ [ править ]
Представление чисел с плавающей точкой
Содержание
Плавающая точка [ править ]
Определение: |
Плавающая точка (floating point) — метод представления действительных чисел, при котором число хранится в виде мантиссы и показателя степени, а значение числа вычисляется по формуле: [math] x = (-1)^ |
Такой метод является компромиссом между точностью и диапазоном представляемых значений. Представление чисел с плавающей точкой рассмотрим на примере чисел двойной точности (double precision). Такие числа занимают в памяти два машинных слова (8 байт на 32-битных системах). Наиболее распространенное представление описано в стандарте IEEE 754.
Кроме чисел двойной точности также используются следующие форматы чисел:
- половинной точности (half precision) (16 бит),
- одинарной точности (single precision) (32 бита),
- четверной точности (quadruple precision) (128 бит),
- расширенной точности (extended precision) (80 бит).
При выборе формата программисты идут на разумный компромисс между точностью вычислений и размером числа.
Нормальная и нормализованная формы [ править ]
Определение: |
Нормальной называется форма представления числа, при которой абсолютное значение мантиссы десятичного числа находится на полуинтервале [math] [0,1) [/math] . |
Недостатком такой записи является тот факт, что числа нельзя записать однозначно: [math] 0.01 = 0.001 \times 10^1 [/math] .
Определение: |
Нормализованной называется форма представления числа, при которой абсолютное значение мантиссы десятичного числа лежит на полуинтервале [math] [1, 10) [/math] , а двоичного на полуинтервале [math] [1, 2) [/math] . |
Числа двойной точности [ править ]
Число с плавающей точкой хранится в нормализованной форме и состоит из трех частей (в скобках указано количество бит, отводимых на каждую секцию в формате double):
- знак
- экспонента (показатель степени) (в виде целого числа в коде со сдвигом)
- мантисса (в нормализованной форме)
В качестве базы (основания степени) используется число [math] 2 [/math] . Экспонента хранится со сдвигом [math] -1023 [/math] .
Знак | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Экспонента (11 бит) | Мантисса (52+1 бит) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1, | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
62 | 52 | 51 | 0 |
Утверждение: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Знак | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Экспонента | Мантисса | ||||||||||||||||
0 /1 | 0 | 0 | 0 | 0 | 0 | 1, | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | = [math]\pm0[/math] |
Согласно стандарту выполняются следующие свойства:
Бесконечность (со знаком) [ править ]
Для приближения ответа к правильному при переполнении, в double можно записать бесконечное значение. Так же, как и в случае с нолем, для этого используются специальные значение мантиссы и экспоненты.
Знак | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Экспонента | Мантисса | ||||||||||||||||
0 /1 | 1 | 1 | 1 | 1 | 1 | 1, | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | = [math]\pm\infty[/math] |
Бесконечное значение можно получить при переполнении или при делении ненулевого числа на ноль.
Неопределенность [ править ]
В математике встречается понятие неопределенности. В стандарте double предусмотрено псевдочисло, которое арифметическая операция может вернуть даже в случае ошибки.
Знак | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Экспонента | Мантисса | ||||||||||||||||
0 /1 | 1 | 1 | 1 | 1 | 1 | 1, | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | 0 /1 | = [math]NaN[/math] |
Неопределенность можно получить в нескольких случаях. Приведем некоторые из них:
- [math] f(NaN) = NaN [/math] , где [math] f [/math] — любая арифметическая операция
- [math] \infty + (-\infty) = NaN [/math]
- [math] 0 \times \infty = NaN [/math]
- [math] \frac<\pm0><\pm0>= \frac<\pm \infty><\pm \infty>= NaN [/math]
- [math] \sqrt
= NaN [/math] , где [math] x \lt 0 [/math]
Денормализованные числа [ править ]
Денормализованные (denormalized numbers) — способ увеличить количество представимых числе в окрестности нуля. Каждое такое число по модулю меньше самого маленького нормализованного. [math] (-1)^s \times 1.M \times 2^E [/math] , в нормализованном виде если [math] E_ где [math] E_ Ввиду сложности, денормализованные числа обычно реализуют на программном уровне, а не на аппаратном. Из-за этого резко возрастает время работы с ними. Это недопустимо в областях, где требуется большая скорость вычислений (например, видеокарты). Так как денормализованные числа представляют числа мало отличные от нуля и мало влияют на результат, зачастую они игнорируются (что резко повышает скорость). При этом используются две концепции: Начиная с версии стандарта IEEE 754 2008 года денормализованные числа называются «субнормальными» (subnormal numbers), то есть числа, меньшие «нормальных». Мера единичной точности используется для оценки точности вычислений. Приведем пример кода на Python, который показывает, при каком значении числа [math] x [/math] компьютер не различает числа [math] x [/math] и [math] x + 1 [/math] . То есть [math] x = 2^ <53>[/math] , так как мантисса числа двойной точности содержит 53 бита (в памяти хранятся 52). В C++ для расчета расстояния между двумя числами двойной точности можно воспользоваться функцией [math] \mathrm [math] \exists \tilde <\epsilon>\in D: [/math] Обозначим [math] v = (b — a) \times (c — a) = (b_x — a_x) (c_y — a_y) — (b_y — a_y) (c_x — a_x)[/math] . Теперь распишем это выражение в дабловой арифметике. [math]\tilde [math] |\delta_i| \leq \varepsilon_m [/math] Заметим, что [math] v \approx \tilde Теперь оценим абсолютную погрешность [math] \epsilon = |v — \tilde [math] |v — \tilde Пусть [math] t = (|(b_x — a_x) (c_y — a_y)| + |(b_y — a_y) (c_x — a_x)|).[/math] Получаем, что [math] \epsilon = |v — \tilde [math]\tilde [math] t \leq \tilde [math] \epsilon = |v — \tilde [math] \tilde <\epsilon>\lt 8 \varepsilon_m \tilde Заметим, что это довольно грубая оценка. Вполне можно было бы написать [math] \tilde <\epsilon>\lt 4.25 \varepsilon_m \tilde Источник
Машинная эпсилон [ править ]
Определение: Машинная эпсилон — наибольшее положительное число [math] \varepsilon_m [/math] , такое что, [math] 1 \oplus \varepsilon_m = 1 [/math] , где [math] \oplus [/math] — машинное сложение.
Утверждение: Unit in the last place (Unit of least precision) [ править ]
Определение: Пусть [math] a [/math] — число с плавающей точкой, мантисса которого имеет длину [math] m [/math] бит, а экспонента — [math] e [/math] бит. Тогда [math] ulp(a) = 2^ Погрешность предиката «левый поворот» [ править ]
Определения [ править ]
Расчет [math] \tilde <\epsilon>[/math] [ править ]
Ответ [ править ]