В С++ (или, может быть, только наши компиляторы VC8 и VC10)3.14
- это двойной литерал, а 3.14f
- это плавающий литерал.
Теперь у меня есть коллега, который заявил:
Мы должны использовать float-литералы для вычислений float и двухлитровых для двойных вычислений, поскольку это может повлиять на точность вычисления, когда константы используются в вычислении.
В частности, я думаю, он имел в виду:
double d1, d2;
float f1, f2;
... init and stuff ...
f1 = 3.1415 * f2;
f1 = 3.1415f * f2; // any difference?
d1 = 3.1415 * d2;
d1 = 3.1415f * d2; // any difference?
Или, добавленный мной, даже:
d1 = 42 * d2;
d1 = 42.0f * d2; // any difference?
d1 = 42.0 * d2; // any difference?
В общем, единственная точка, которую я могу увидеть при использовании 2.71828183f
, - это убедиться, что константа, которую я пытаюсь указать, действительно будет вписываться в float (иначе компилятор/предупреждение).
Может кто-то пролить свет на это? Вы указываете постфикс f
? Почему?
Чтобы процитировать ответ, я неявно принял это как должное:
Если вы работаете с переменной float и двойным литеральным операция будет выполняться как двойная, а затем конвертируется обратно в float.
Может ли быть какой-либо вред в этом? (За исключением очень, очень теоретического воздействия на производительность?)
Дальнейшее редактирование: Было бы неплохо, если бы ответы, содержащие технические детали (оцененные!), также могли бы включать в себя то, как эти различия влияют на код общего назначения. (Да, если вы хрустали число, вы, вероятно, хотели бы убедиться, что ваши операции с большими числами с плавающей запятой максимально эффективны (и правильны), насколько это возможно, но имеет ли значение код общего назначения, который называется несколько раз? Isn ' t чище, если код просто использует 0.0
и пропускает суффикс с плавающей точкой для поддержания! - float?)