Плавающая точка в .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, но это никак не отразится на точности.