Размер
|
Диапазон
|
Точность
|
4 байта
|
от ±1.18 x 10-38 до ±3.4 x 1038
|
6-9 значащих цифр (в основном 7)
|
8 байт
|
от ±2.23 x 10-308 до ±1.80 x 10308
|
15-18 значащих цифр (в основном 16)
|
80 бит (12 байт)
|
от ±3.36 x 10-4932 до ±1.18 x 104932
|
18-21 значащих цифр
|
16 байт
|
от ±3.36 x 10-4932 до ±1.18 x 104932
|
33-36 значащих цифр
|
Может показаться немного странным, что 12-байтовая переменная типа с плавающей точкой имеет тот же диапазон, что и 16-байтовая переменная. Это потому, что они имеют одинаковое количество бит, выделенных для экспонента (только в 16-байтовой переменной точность будет выше).
Правило: Используйте по умолчанию тип double вместо типа float, так как его точность выше.
Ошибки округления
Рассмотрим дробь 1/10. В десятичной системе счисления эту дробь можно представить как 0.1, в двоичной системе счисления эта дробь представлена в виде бесконечной последовательности: 0.00011001100110011… Именно из-за подобных разногласий в представлении чисел в разных системах счисления — у нас могут возникать проблемы с точностью. Например:
Результат выполнения программы выше:
0.1
0.10000000000000001
Первый cout выводит 0.1 (что и ожидаемо). После того, как мы изменили точность cout-а до 17 цифр, мы увидели, что переменная d — это не совсем 0.1! Подобное происходит из-за ограничений в количестве выделяемой памяти для переменных типа double, а также в необходимости «округлять» числа. По факту мы получили типичную ошибку округления.
Подобные ошибки могут иметь неожиданные последствия:
Результат выполнения программы выше:
1
0.99999999999999989
Хотя мы ожидали, что d1 и d2 окажутся равными, но это не так. А что, если бы нам довелось сравнивать эти переменные и, исходя из результата, выполнять определённый сценарий? В таком случае ошибок нам не миновать.
Математические операции (например, сложение или умножение), как правило, только увеличивают масштаб этих ошибок. Даже если 0.1 имеет погрешность в 17-й значащей цифре, то при выполнении операции сложения десять раз, ошибка округления переместиться к 16-й значащей цифре.
Do'stlaringiz bilan baham: |