Должны ли мы обычно использовать литералы float для плавающих чисел вместо более простых литералов double?

В 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?)

29
задан Deduplicator 15 May 2014 в 12:45
поделиться