Количество значащих цифр для типа с плавающей запятой

в описании типа 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(...) показывает вам реальный номер поплавка, который был сохранен. Вы не можете гарантировать количество значимых цифр в плавающем числе.