Количество значащих цифр для типа с плавающей запятой
в описании типа float
в C упоминается, что количество значащих цифр 6
. Однако,
float f = 12345.6;
а затем печать с помощью printf () не печатает 12345.6
, он печатает 12345.599609
. Так что "6 значащих цифр" (или "15 в случае double
") означает для типа с плавающей запятой?
4 ответов
по словам стандартный Не все десятичные числа можно хранить конкретно в памяти. В зависимости от размера представления ошибка может достигать определенного максимума. Для float
Это 0.0001%
(6 значащих цифр = 10^-6
= 10^-4 %
).
в вашем случае ошибка (12345.6 - 12345.599609) / 12345.6 = 3.16e-08
гораздо ниже, чем максимальная ошибка для поплавков.
6 значащих цифр означает, что максимальная погрешность составляет примерно +/- 0.0001%. Одно значение float фактически имеет около 7,2 цифр точности (источник). Это означает, что ошибка примерно +/- 12345.6/10^7 = 0.00123456. Которая на порядок ошибка (0.000391).
то, что вы видите, на самом деле не проблема со значащими цифрами, но тот факт, что числа на компьютере хранятся в двоичном формате, и нет конечного двоичного представления для 3/5 (= 0.6). 3/5 в двоичном формате выглядит как 0.100110011001... с "1001" узор повторять вовеки. Эта последовательность эквивалентна 0,599999... повторяющий. Вы фактически получаете три десятичных знака справа от десятичной точки, прежде чем любая ошибка, связанная с точностью, срабатывает.
этот аналогично тому, как нет конечного представления base-10 1/3; у нас есть 0.3333, повторяющееся навсегда.
проблема здесь в том, что вы не можете гарантировать, что число может быть сохранено в float. Вам нужно представить это число с мантиссой, базой и показателем как IEEE 754 объясняет. Число printf(...)
показывает вам реальный номер поплавка, который был сохранен. Вы не можете гарантировать количество значимых цифр в плавающем числе.