tags:

views:

145

answers:

4

I came across this line in some code and can't find the syntax defined anywhere:

*(float *)csCoord.nX = lImportHeight* .04f; /* magic number to scale font size */

If I remove the f from .04f then the compiler gives a warning about possible data loss due to a conversion from 'double' to 'float'. I assume the f is doing some sort of typecasting.

Has anyone seen this before? Where is this defined in the C standard?

+10  A: 

The trailing f indicates to the compiler that it is a float type literal, just like "" indicate a literal string and the L suffix indicates a long int.

The C++ spec for literals is the same.

Ryan Graham
A: 

Don't know where it's defined in the standard, but you use an f to indicate a float, otherwise the compiler assumes it's a double. Similarly, you can specify an integer to be unsigned by adding a u, or a long by l (lowercase ell), etc.

Graeme Perrow
+2  A: 

Without "f", the quantity 0.04 is a double. When you multiple lImportHeight with a double, you get another double. Then you store it in a float-sized memory location, losing precision. With "f", 0.04f is a float literal. You multiple lImportHeight with it, and you get a float; then the assignment does not cause loss of precision.

antti.huima
A: 

What exactly is the problem? Does your compiler choke on .04f? Try

(float) .04
bromfiets
No, it compiles fine. I just had never seen that syntax before and wanted to make sure I understood it.
Tim