The three distinct types
float,
double,
and
long double
can represent floating-point numbers
.The type 
double provides at least as much
precision as 
float, and the type 
long double provides at
least as much precision as 
double.The set of values of the type
float is a subset of the set of values of the type
double; the set of values of the type 
double is a subset
of the set of values of the type 
long double.An implementation may also provide additional types
that represent floating-point values and define them (and cv-qualified versions thereof) to be
extended floating-point types.[
Note 9: 
Any additional implementation-specific types representing floating-point values
that are not defined by the implementation to be extended floating-point types
are not considered to be floating-point types, and
this document imposes no requirements on them or
their interactions with floating-point types
. — 
end note]
Except as specified in 
[basic.extended.fp],
the object and value representations and accuracy of operations
of floating-point types are 
implementation-defined
.