Почему auto выводит эту переменную как double, а не как float?

В приведенном ниже фрагменте auto выводит переменную в double, но я хочу float.

auto one = 3.5;

Всегда ли он использует double для литералов с десятичной точкой? Как это решает между поплавком и двойным?

Ответы

Ответ 1

Тип литерала 3.5 - double. Для float используйте 3.5f

Вы можете поиграть с этим фрагментом, чтобы увидеть информацию о различных типах.

Ответ 2

3.5 является литералом double. Таким образом, auto правильно выводит его тип как double. Вы по-прежнему можете использовать его для инициализации переменной float, но наиболее правильным способом является использование литерала float, например 3.5f. f в конце называется суффиксом. Суффиксы для литералов с плавающей точкой:

  • (без суффикса) определяет двойной
  • f F определяет float
  • l L определяет длинный двойной

Помимо литералов с плавающей точкой, существуют также суффиксы для интегральных литералов и пользовательских литералов.

Ответ 3

В C++ (и C) плавающие литералы обрабатываются как double по умолчанию, если не указано в f or F or l or L.

Стандарт имеет следующее:

2.14.4 Тип плавающего литерала - двойной, если явно не указано суффиксом. Суффиксы f и F указывают float, суффиксы l и L указывают long double. Если масштабированное значение не входит в диапазон представимых значений для его типа, программа имеет некорректную форму.

Следовательно,

auto one = 3.5;

всегда double, и если вы собираетесь float это должно быть закодировано как

auto one = 3.5f;

Ответ 4

Тип литерала с плавающей запятой в C++ автоматически double, если:

  1. Суффикс f, в этом случае тип литерала float

  2. L имеет суффикс, и в этом случае тип литерала будет long double

Итак, если вы хотите, чтобы ваша переменная была float, сделайте следующее:

auto one = 3.5f;