PWR044: Avoid unnecessary floating-point data conversions involving constants
Issue
Mixing float type value with double type constants results in unnecessary data conversions.
Actions
Instead of the double constant, explicitly specify a float constant by appending
the constant with f
.
Relevance
According to the C/C++ standard, binary operators (+
, -
, *
, /
, %
, <
,
>
, <=
, >=
, ==
, !=
) involving a float value and a double constant can
often result in unnecessary data conversions: the float value is first promoted
to a double, then the binary operator is evaluated. Most of the time this is not
the intended behavior.
Code example
Have a look at the following code:
float example(float a) {
return a * 2.2;
}
During the evaluation of the expression a * 2.2
, the following happens:
-
First, the floating point in variable
a
is promoted from float to double; -
Second, multiplication is performed using doubles;
-
And third, the resulting value is converted back to float.
In this particular example, there are two unnecessary conversions: one is
promoting a
to double, and the other is promoting the result of multiplication
a * 2.2
back to float. The solution is to use a float constant 2.2f
instead
of the double constant 2.2
.
float example(float a) {
return a * 2.2f;
}