What is the difference between
float f = (float) 99.32 ; and
float f = 99.32f ; Both of them compiled and ran successfully.
What is the difference between
float f = (float) 99.32 ; and
float f = 99.32f ; Both of them compiled and ran successfully.
float f = 99.32f ; That is a float literal, which means a float variable being assigned with a float value directly.
float f = (float) 99.32 ; That is a float variable that is assigned a double value that is cast to float before being assigned.
99.32 is a floating point literal, which has the type double.99.32 is a double, not implicit casted to it. This is called "floating point literal of type double". 99.32f is a float and not casted to it. This is called "floating point literal of type float". There is no cast at float f = 99.32f; or double d = 99.32;.The difference may be optimized away, but in the first case you have a double literal that is type casted to a float while you have a float literal in the second case.
If not optimized away you will get a typecast in the code in the second example.
However there are corner cases where the result could (depending on rounding mode) be slightly different. If your number can't be exactly represented you will in the first case get rounding twice - first when you round the decimal representation to a double and then when you round that to a float, while in the first case you round the decimal representation directly to a float.
0x1.000004p-1 while with suffix you get 0x1.000002p-1 (see ideone.com/EV3QeG). See also en.wikipedia.org/wiki/Rounding#Double_rounding0x1.000003p-1 as double (and therefore 0x1.000004p-1 when double-rounded to float), and last two digits of 11-16 (roughly half of this range) result in 0x1.000002p-1. So the range of values over which this can occur (for each instance, presumably spaced one float ULP apart) is roughly one half of one double ULP wide, and in every case yields an "error" of one half of one float ULP when rounded up or down, since the real values are roughly halfway between two float values.In the line float f = (float) 99.32; the literal 99.32 is created as a double type by default and is then cast to a float.
In the line float f = 99.32f ; the literal is created as a float type due to the trailing f in 99.32f and no type casting is required.
The latter would be analogous to writing double f = 99.32; as you'd have a double type being assigned directly to a variable of a matching type.
Floating point literals without a suffix are by default of double type.
Thus, stating float f = (float) 99.32; you first cast explicitly literal 99.32 which is of type double to a float and then assign it to variable f.
Stating float f = 99.32; does the same thing but in this case the conversion between types is done implicitly.
If you want to avoid implicit conversion you should use the f suffix to define your literal (i.e., float f = 99.32f;)
f suffix the result is sometimes wrongThe difference is that the literal 99.32 is of type double, while the literal 99.32f is of type float.
The first statement assigns the float literal to a float variable. Nothing special.
The second statement casts a double literal to a float, and assigns the result to a float variable.
As far as the standard is concerned, you can assign a double literal to a float variable, without explicitly casting it yourself. In that case implicit cast occurs. E.g. :
float f = 99.32; You can even do :
float f = (double) 10.5f; and the right hand side is still implicitly converted to a float.
Please note that most modern compilers optimize those away, so representing floats is usually matter of style and preference. Just be consistent.
f suffix the result is sometimes wrong. Always use f for float and L for long double