Плавающая точка в .NET - часть 1: принципы и форматы - Области и точность

ОГЛАВЛЕНИЕ


Области и точность

Область числовых форматов - это интервал между наименьшими и наибольшими возможными значениями формата. Область 16-битного целого типа со знаком начинается с -32768 и завершается 32767. Область чисел с плавающей точкой двойной точности (практически) равна от -1e+308 до 1e+308. Числа за пределами области формата не могут быть представлены напрямую. Числа в пределах области могут не существовать в используемом числовом формате - это относится практически к большинству. Но всегда есть какой-нибудь числовой формат, который будет очень близок к необходимому числу.

Точность и достоверность зачастую считаются одним и тем же, но на самом деле это разные вещи.

Точность - это свойство числового формата, которое относится к количеству информации, используемой для представления числа. Лучшая или более высокая точность означает, что больше цифр может быть представлено, а также означает лучшее решение: числа представлены с высокой точностью и ближе к реальному значению. 1.3333 является числом, которое представлено с точностью в 5 десятичных цифр: одна до точки и четыре после. 1.333300 является тем же самым числом, но представленным с точностью в 7 чисел.

Точность может быть абсолютной и относительной. Целочисленные типы имеют абсолютную точность равную 1. Каждое целое число в пределах области типа представлено с такой точностью. Типы с фиксированной точкой, такие как Currency в ранних версиях Visual Basic, также обладают абсолютной точностью. Для типа Currency , она равна 0.0001, что означает, что каждое число, кратное 0.0001 в пределах области данного типа может быть представлено в данном формате.

Форматы с плавающей точкой используют относительную точность. Это означает, что точность всегда относительно зависима от размера числа. К примеру, 1.3331, 1.3331e+5 = 13331, и 1.3331e-3 = 0.0013331 все имеют 5 десятичных цифр относительной точности.

Точность также является свойством подсчета. В данном случае она относится к числу цифр, используемых в подсчетах, а в частности является точностью, используемой в промежуточных результатах. В качестве примера, мы подсчитываем простое выражение с точностью в одну или две цифры:

Использование точности в одну цифру:
0.4 * 0.6 + 0.6 * 0.4 = 0.24 + 0.24 Подсчет товара
= 0.2 + 0.2 Округление до 1 цифры после запятой
= 0.4 Финальный результат
Использование точности в две цифры:
0.4 * 0.6 + 0.6 * 0.4 = 0.24 + 0.24 Подсчет товара
= 0.24 + 0.24 Сохранение двух чисел
= 0.48 Подсчет суммы
= 0.5 Округление до 1 цифры после запятой

Сравнивая с реальным результатом (0.48), мы видим, что точность в 1 цифру в результате будет ошибочно на 0.08, а использование двойной точности даст ошибку, равную 0.02. Из данного примера стоит извлечь урок о том, что стоит использовать повышенную точность в промежуточных вычислениях, если это возможно.

Достоверность - это свойство числа в определенном контексте. Оно отображает то, насколько число близко к истинному значению в данном контексте. Без контекста достоверность не имеет смысла, точно также, как "ему 25 лет" не имеет значения потому, что мы не знаем о ком идет речь.

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

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

Byte   n0 = 0x03;
Int16  n1 = 0x0003;
Int32  n2 = 0x00000003;
Single n3 = 3.000000f;
Double n4 = 3.000000000000000;

Каждая из данных пяти переменных точно представляет число 3. Переменные хранятся в различных видах точности, используя от 8 до 64 бит. Для ясности картины, точность чисел явно указана, но это никак не влияет на достоверность.

А теперь давайте посмотрим на то же число 3 в качестве приближенного значения для Пи (3.13). 3 всего лишь точно относительно десятичной части, независимо от точности. Значение типа Double использует в 8 раз больше памяти чем значение типа Byte value, но это никак не отразится на точности.