Ваш вопрос не уникален, на него уже много раз отвечали. Это не простая тема и просто потому, что ответы публикуются, не обязательно означает, что они будут хорошего качества. Если вы посмотрите немного, вы найдете действительно хорошие вещи. И это займет у вас меньше времени.
Бьюсь об заклад, кто-то будет -1 меня за комментарии и не отвечает.
_____ Редактировать _____
Что важно для понимания числа с плавающей запятой, так это осознание того, что все отображается в двоичных разрядах. Поскольку большинству людей трудно понять это, они пытаются увидеть это с точки зрения десятичных цифр.
По предмету 511/512 вы можете начать со значения 1.0. В плавающей точке это может быть выражено как i.000000 ... * 2 ^ 0 или неявный набор битов (в 1), умноженный на 2 ^ 0, то есть равный 1. Так как 511/512 меньше 1, вам нужно начать со следующего меньшая мощность -1, что дает i.000000 ... * 2 ^ -1, т.е. 0,5. Обратите внимание, что единственное, что изменилось, это показатель степени. Если мы хотим выразить 511 в двоичном виде, мы получим 9 единиц - 111111111 или в плавающей запятой с неявным битом i.11111111 - который мы можем разделить на 512 и сложить с показателем -1, что дает i.1111111100 ... * 2 ^ -1.
Как это переводится на 0,998046875?
Хорошо, для начала неявный бит представляет 0,5 (или 2 ^ -1), первый явный бит 0,25 (2 ^ -2), следующий явный бит 0,125 (2 ^ -3), 0,0625, 0,03125 и т. Д. пока вы не представили девятый бит (восьмой явный). Суммируйте их, и вы получите 0,998046875. Из i.11111111 мы находим, что это число представляет 9 двоичных разрядов точности и, соответственно, 9 десятичных разрядов.
Если вы умножите 511/512 на 512, вы получите i1111111100 ... * 2 ^ 8. Здесь есть те же девять двоичных цифр точности, но только три десятичных знака (для 511).
Рассмотрим i.11111111111111111111111 (i + 23 единицы) * 2 ^ -1. Мы получим дробь (2 ^ (24-1) ^ / (2 ^ 24)) с 24 двоичными и 24 десятичными цифрами точности. При соответствующем форматировании printf будут отображены все 24 десятичных знака. Умножьте его на 2 ^ 24, и у вас останется 24 двоичных знака точности, но только 8 десятичных (для 16777215).
Теперь рассмотрим i.1111100 ... * 2 ^ 2, что соответствует 7.875. i11 - целая часть, а 111 - дробная часть (111/1000 или 7/8). 6 двоичных цифр точности и 4 десятичных знака.
Десятичное мышление при выполнении операций с плавающей запятой крайне вредно для его понимания. Освободи себя!