Округление по необходимости
Многие программисты не знают о свойствах данного формата с плавающей запятой: не все значения, которые можно описать в десятичных дробях, могут храниться в двоичном виде. По необходимости некоторые числа должны округляться до очень близкого значения.
Чтобы привести некоторый контекст поведения такого округления, сравните его с рациональными числами, такими как Уз, представляемыми периодической дробью, например 0,333.... Истинное значение не может быть представлено десятичной дробью, поскольку потребовалось бы писать бесконечное число цифр. Число цифр является точностью числа, поэтому периодическая дробь потребовала бы бесконечной точности.
Компромисс состоит в использовании конечной точности путем выбора числового значения, находящегося как можно ближе к исходному значению, например 0,333. Однако это означает, что значение не является в точности тем значением, которое предполагалось использовать.
- + - + - =1,000 3 3 3
0,333 + 0,333 + 0,333 = 0,999
Даже если увеличить точность, по-прежнему нельзя будет сложить три из этих приближений одной третьей, чтобы получить истинное значение, равное 1,0. Это необходимый компромисс использования конечной точности для представления чисел, которые могут содержать периодические дроби.
- + - + - = 1,000000 3 3 3
0,333333 + 0,333333 + 0,333333 = 0,999999
Это означает, что некоторые допустимые числа, которые можно себе вообразить, не могут быть представлены с конечной точностью. Можно полагать, что это хорошо, так как в действительности нельзя ввести число с бесконечным количеством цифр, поэтому, естественно, любое число, которое допустимо для ввода, представляется с конечной точностью и должно храниться точно, не так ли? К сожалению, нет.
Согласно стандарту IEEE 754 числа с плавающей запятой представляются в формате двоичной системы счисления. Значения, для которых требуется бесконечная точность в двоичном формате, отличаются от чисел, которые ведут себя таким же образом в десятичной дроби. Некоторые значения, которым требуется только конечная точность в десятичной дроби, например 59,95, нуждаются в бесконечной точности для точного представления в двоичном виде. Тип данных FLOAT не позволяет делать этого, поэтому им используется ближайшее значение, сохраняемое в двоичном формате, которое равно 59,950000762939 в десятичном формате. |