Я вижу много разговоров о printf
и о том, как он печатает материал «не в ту сторону», потому что все округляется и т. Д. printf
печатает именно то, что вы ожидаете , когда выобратите внимание, что фактическое число, хранящееся в a
, равно 0.05600000172853469848
.
OP предполагает, что число, сохраненное в нем, равно 0.0559999...
, но при взгляде на фактическое число видно, чтонеправильно:
#include <stdio.h>
int main() {
float a = 0.056;
printf("%A\n", a);
}
Это напечатает 0X1.CAC084P-5
, что означает, что наша мантисса (0xCAC084
) равна 110010101100000010000100
.Это 24 бита, но не 23, которые мы можем хранить в 32-битной (IEEE-754 одинарной точности) плавающей запятой, что означает, что то, что там есть, на самом деле 11001010110000001000010
Помните, что мантисса нормализована и предполагаетсяначнем с 1
, поэтому, применяя показатель степени и т. д., наш номер:
0.0000111001010110000001000010
, что переводится как 0.05600000172853469848
. ОП предполагает, что вместо этого:
0.00001110010101100000010000011
, что, безусловно, является более точным, НО, который требует немного больше, чем может хранить мантисса, так что мы бы закончили с этим:
0.0000111001010110000001000001
или 0.05599999800324440002
.
Конечно, ни одно из чисел не является 0.056
, но ошибка в представлении выше для последнего!Поэтому неудивительно, что мы получаем то, что получаем ...