Во-первых, компиляторы заботятся о суффиксе f
.1.0
является двойным.1.0f
это поплавок.Например:
printf("%.15f %.15f\n", 0.1f, 0.1);
производит 0.100000001490116 0.100000000000000
(обратите внимание, что второе число не является действительным 0,1 больше, чем первое, оно просто ближе к нему).
Это не имеет значениятолько для определения того, какие числа могут и не могут быть представлены, а также для определения типа операций, в которых участвует эта константа. Например:
printf("%.15f %.15f\n", 1.0f/10.0f, 1.0/10.0);
производит тот же вывод, что и раньше.Здесь важно отметить, что 1 и 10 представимы в точности как float
, так же как и double
.Мы видим не округление на буквальном уровне, а тип операции, определяемый типом операндов.
Компиляторы не снисходительны к вашим примерам.Они строго применяют правила, которые вы можете найти в соответствующем стандарте , особенно в разделах 6.3.1.4 и 6.3.1.5.