Ближайший float
значение пи имеет двоичное кодирование ...
0 10000000 10010010000111111011011
... в котором я вставленный пробелы между знаком, показателем и мантиссы. Показатель смещен, поэтому биты выше кодируют множитель 2^1 == 2, а мантисса кодирует долю выше 1, причем первый бит стоит половину, и каждый бит после этого стоит вдвое меньше, чем бит до.
Поэтому мантиссы биты выше стоит:
1 x 0.5
0 x 0.25
0 x 0.125
1 x 0.0625
0 x 0.03125
0 x 0.015625
1 x 0.0078125
0 x 0.00390625
0 x 0.001953125
0 x 0.0009765625
0 x 0.00048828125
1 x 0.000244140625
1 x 0.0001220703125
1 x 0.00006103515625
1 x 0.000030517578125
1 x 0.0000152587890625
1 x 0.00000762939453125
0 x 0.000003814697265625
1 x 0.0000019073486328125
1 x 0.00000095367431640625
0 x 0.000000476837158203125
1 x 0.0000002384185791015625
1 x 0.00000011920928955078125
Таким образом, наименьший значащий бит после умножения показателя закодированные значения "2" стоит ...
0.000 000 238 418 579 101 562 5
I добавлены пробелы, чтобы было легче подсчитать, что последняя цифра не 0 находится в 22nd десятичная запятая.
Значение вопрос говорит printf()
отображается ниже появится рядом с вкладом наименее значащий бит мантиссы:
3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
0.0000002384185791015625
Очевидно, что наименее значащие цифры выстраиваются правильно. Если вы добавили все вклады мантиссы выше, добавили неявный 1, а затем умножить на 2, вы получите точный значение printf
. Это объясняет, как значение float
равно точно (в математическом смысле нулевой случайности) значение, показанное printf
, но сравнение ниже pi показывает только первые 6 знаков после запятой, точный, учитывая конкретное значение, которое мы хотим магазин.
3.14159274101257324218750000000000000000000000000000000000000000000000000000000000
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899
^
В вычислительной технике, это общий для обозначения точности с плавающей точкой типа, когда мы на самом деле заинтересованы в точности мы можем положиться. Я полагаю, вы могли бы утверждать, что, будучи изолированным, точность поплавков и удвоений бесконечна, округление, необходимое при их использовании для приближения чисел, которые они не могут кодировать идеально, для большинства практических целей случайное, и в этом смысле они предлагают конечные значимые цифры точности при кодировании таких чисел.
Таким образом, printf
не является неправильным отображать столько цифр; в некоторых приложениях может использоваться float
для кодирования этого точного номера (почти наверняка, поскольку природа вычислений приложения включает в себя суммы значений 1/2^n), но это было бы исключение, а не правило.
поплавки являются * бинарными *. Они не имеют * «десятичных цифр точности» точно. – hyde
Прочитайте http://floating-point-gui.de/ –
Фактически float имеет 24 бита значительного (23 бит мантиссы + 1 скрытый бит) –