В C ++ (или, может быть, только наши компиляторы VC8 и VC10) 3.14
- это двойной литерал, а 3.14f
- это литерал с плавающей точкой.
Теперь у меня есть коллега, который заявил:
Мы должны использовать литералы с плавающей запятой для вычислений с плавающей запятой и двойные литералы для двойных вычислений, поскольку это может повлиять на точность вычисления при использовании констант в вычислении.
В частности, я думаю, что он имел в виду:
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
заключается в том, чтобы убедиться, что константа, которую я пытаюсь указать, действительно поместится в число с плавающей точкой (в противном случае ошибка / предупреждение компилятора).
Может кто-нибудь пролить свет на это?Вы указываете постфикс f
?Почему?
Чтобы процитировать ответ, который я неявно воспринимал как должное:
Если вы работаете с переменной с плавающей точкой и двойным литералом, вся операция будет выполнена как двойнаяи затем преобразуется обратно в плавающее.
Может ли быть в этом какой-нибудь вред?(Кроме очень, очень теоретического влияния на производительность?)
Дальнейшее редактирование: Было бы неплохо, если бы ответы, содержащие технические детали (приветствуются!), Могли также включать, как эти различия влияюткод общего назначения .(Да, если вы работаете с числами, вам, вероятно, хотелось бы убедиться, что ваши операции с плавающей запятой с большим числом n настолько эффективны (и корректны), насколько это возможно - но имеет ли это значение для кода общего назначения, который вызывается несколько раз?Это чище, если код просто использует 0.0
и пропускает - трудно поддерживать! - суффикс float?)