The type of
a *floating-point-literal* ([basic.fundamental], [basic.extended.fp])
is determined by
its *floating-point-suffix* as specified in Table 12.

Table 12: Types of *floating-point-literal**s* [tab:lex.fcon.type]

type | ||

none | double | |

f or F | float | |

l or L | long double | |

f16 or F16 | std::float16_t | |

f32 or F32 | std::float32_t | |

f64 or F64 | std::float64_t | |

f128 or F128 | std::float128_t | |

bf16 or BF16 | std::bfloat16_t |

The *significand* of a *floating-point-literal*
is the *fractional-constant* or *digit-sequence*
of a *decimal-floating-point-literal*
or the *hexadecimal-fractional-constant*
or *hexadecimal-digit-sequence*
of a *hexadecimal-floating-point-literal*.

In the significand,
the sequence of *digit**s* or *hexadecimal-digit**s*
and optional period are interpreted as a base N real number s,
where N is 10 for a *decimal-floating-point-literal* and
16 for a *hexadecimal-floating-point-literal*.

If an *exponent-part* or *binary-exponent-part*
is present,
the exponent e of the *floating-point-literal*
is the result of interpreting
the sequence of an optional *sign* and the *digit**s*
as a base 10 integer.

Otherwise, the exponent e is 0.

The scaled value of the literal is
for a *decimal-floating-point-literal* and
for a *hexadecimal-floating-point-literal*.

[*Example 1*: — *end example*]

If the scaled value is not in the range of representable
values for its type, the program is ill-formed.

Otherwise, the value of a *floating-point-literal*
is the scaled value if representable,
else the larger or smaller representable value nearest the scaled value,
chosen in an implementation-defined manner.