Тип вашего компилятора float
, вероятно, использует 32-битный формат IEEE 754 с одинарной точностью.
67107842 - это 26-разрядное двоичное число:
11111111111111110000000010
Формат с одинарной точностью представляет большинство чисел как 1.x
, умноженное на некоторую (положительную или отрицательную) степень двойки, где после двоичного разряда хранится 23 бита, причем подразумевается ведущий 1.
(очень маленькие числа исключение).
Но 67107842 потребует 24 бита после двоичного разряда (должно быть представлено как 1.111111111111111000000001
, умноженное на 2 25 ). Так как есть 23 места для хранения только 23 битов, последний 1
теряется. Таким образом, в данном случае неверно значение в a
, а не деление - a
фактически содержит 67107840 (11111111111111110000000000
), что в точности равно 131070 * 512.
Вы можете увидеть это, если напечатаете также a
:
printf("%lf %lf %lf\n", a, b, c);
1024 * дает *
67107840.000000 512.000000 131070.000000