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