Нужно ли типизировать 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/

Другие вопросы по тегам