Нужно ли типизировать float для удвоения при использовании math.h?
Я использую Cosmic C Compiler для микроконтроллеров STM8 и использую плавающие переменные. Для используемой в настоящее время платформы компилятор не предоставляет двойные типы. Во всяком случае, когда кто-то использует двойные, они рассматриваются как поплавки.
Интересно, нужно ли типизировать float для удвоения при использовании, например, fabs()? Объявлен как double fabs(double x);
Я не нашел ничего в документации компилятора по этому поводу.
Но даже без приведения типов он компилируется без предупреждений. Кстати, GCC компилируется также без предупреждений, когда я смешиваю double с float.
1 ответ
Числовое продвижение
Всякий раз, когда значение одного типа преобразуется в значение большего аналогичного типа данных, это называется числовым повышением (или расширением, хотя этот термин обычно зарезервирован для целых чисел). Например, int может быть расширен в long, или float увеличен в double:
1 2 длинных л (64); // расширяем целое число 64 до длинного double d(0.12f); // продвигаем число с плавающей запятой 0,12 в двойном выражении Хотя термин "числовое продвижение" охватывает любой тип продвижения, в C++ есть два других термина с особым значением:
Интегральное продвижение включает в себя преобразование целочисленных типов, более узких, чем int (что включает в себя bool, char, unsigned char, char со знаком, short без знака, short short со знаком), в целое число (если возможно) или целое число без знака. Раскрутка с плавающей точкой включает в себя конвертацию с плавающей точкой в двойную. Интегральное продвижение и продвижение с плавающей запятой используются в особых случаях для преобразования меньших типов данных в int/unsigned int или double, потому что эти типы данных, как правило, наиболее эффективны для выполнения операций.
Важно помнить о рекламных акциях, что они всегда безопасны и не приводят к потере данных.
Источник:
http://www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/