double
is, in some ways, the "natural" floating point type in the C language, which also influences C++. Consider that:
- an unadorned, ordinary floating-point constant like
13.9
has type double
. To make it float, we have to add an extra suffix f
or F
.
- default argument promotion in C converts
float
function arguments* to double
: this takes place when no declaration exists for an argument, such as when a function is declared as variadic (e.g. printf
) or no declaration exists (old style C, not permitted in C++).
- The
%f
conversion specifier of printf
takes a double
argument, not float
. There is no dedicated way to print float
-s; a float
argument default-promotes to double
and so matches %f
.
On modern hardware, float
and double
are usually mapped, respectively, to 32 bit and 64 bit IEEE 754 types. The hardware works with the 64 bit values "natively": the floating-point registers are 64 bits wide, and the operations are built around the more precise type (or internally may be even more precise than that). Since double
is mapped to that type, it is the "natural" floating-point type.
The precision of float
is poor for any serious numerical work, and the reduced range could be a problem also. The IEEE 32 bit type has only 23 bits of mantissa (8 bits are consumed by the exponent field and one bit for the sign). The float type is useful for saving storage in large arrays of floating-point values provided that the loss of precision and range isn't a problem in the given application. For example, 32 bit floating-point values are sometimes used in audio for representing samples.
It is true that the use of a 64 bit type over 32 bit type doubles the raw memory bandwidth. However, that only affects programs which with a large arrays of data, which are accessed in a pattern that shows poor locality. The superior precision of the 64 bit floating-point type trumps issues of optimization. Quality of numerical results is more important than shaving cycles off the running time, in accordance with the principle of "get it right first, then make it fast".
* Note, however, that there is no general automatic promotion from float
expressions to double
; the only promotion of that kind is integral promotion: char
, short
and bitfields going to int
.