Files
cppdraft_translate/cppdraft/lex/fcon.md
2025-10-25 03:02:53 +03:00

120 lines
9.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[lex.fcon]
# 5 Lexical conventions [[lex]](./#lex)
## 5.13 Literals [[lex.literal]](lex.literal#lex.fcon)
### 5.13.4 Floating-point literals [lex.fcon]
[floating-point-literal:](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]")
[*decimal-floating-point-literal*](#nt:decimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")
[*hexadecimal-floating-point-literal*](#nt:hexadecimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")
[decimal-floating-point-literal:](#nt:decimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")
[*fractional-constant*](#nt:fractional-constant "5.13.4Floating-point literals[lex.fcon]") [*exponent-part*](#nt:exponent-part "5.13.4Floating-point literals[lex.fcon]")opt [*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]")opt
[*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]") [*exponent-part*](#nt:exponent-part "5.13.4Floating-point literals[lex.fcon]") [*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]")opt
[hexadecimal-floating-point-literal:](#nt:hexadecimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")
[*hexadecimal-prefix*](lex.icon#nt:hexadecimal-prefix "5.13.2Integer literals[lex.icon]") [*hexadecimal-fractional-constant*](#nt:hexadecimal-fractional-constant "5.13.4Floating-point literals[lex.fcon]") [*binary-exponent-part*](#nt:binary-exponent-part "5.13.4Floating-point literals[lex.fcon]") [*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]")opt
[*hexadecimal-prefix*](lex.icon#nt:hexadecimal-prefix "5.13.2Integer literals[lex.icon]") [*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2Integer literals[lex.icon]") [*binary-exponent-part*](#nt:binary-exponent-part "5.13.4Floating-point literals[lex.fcon]") [*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]")opt
[fractional-constant:](#nt:fractional-constant "5.13.4Floating-point literals[lex.fcon]")
[*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")opt . [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
[*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]") .
[hexadecimal-fractional-constant:](#nt:hexadecimal-fractional-constant "5.13.4Floating-point literals[lex.fcon]")
[*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2Integer literals[lex.icon]")opt . [*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2Integer literals[lex.icon]")
[*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2Integer literals[lex.icon]") .
[exponent-part:](#nt:exponent-part "5.13.4Floating-point literals[lex.fcon]")
e [*sign*](#nt:sign "5.13.4Floating-point literals[lex.fcon]")opt [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
E [*sign*](#nt:sign "5.13.4Floating-point literals[lex.fcon]")opt [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
[binary-exponent-part:](#nt:binary-exponent-part "5.13.4Floating-point literals[lex.fcon]")
p [*sign*](#nt:sign "5.13.4Floating-point literals[lex.fcon]")opt [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
P [*sign*](#nt:sign "5.13.4Floating-point literals[lex.fcon]")opt [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
[sign:](#nt:sign "5.13.4Floating-point literals[lex.fcon]") one of
+ -
[digit-sequence:](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]")
[*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")
[*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]") 'opt [*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")
[floating-point-suffix:](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]") one of
f l f16 f32 f64 f128 bf16 F L F16 F32 F64 F128 BF16
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L1718)
The type of
a [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]") ([[basic.fundamental]](basic.fundamental "6.9.2Fundamental types"), [[basic.extended.fp]](basic.extended.fp "6.9.3Optional extended floating-point types"))
is determined by
its [*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]") as specified in Table [11](#tab:lex.fcon.type "Table 11: Types of floating-point-literals")[.](#1.sentence-1)
[*Note [1](#note-1)*:
The floating-point suffixesf16, f32, f64, f128, bf16,F16, F32, F64, F128, and BF16 are conditionally-supported[.](#1.sentence-2)
See [[basic.extended.fp]](basic.extended.fp "6.9.3Optional extended floating-point types")[.](#1.sentence-3)
— *end note*]
Table [11](#tab:lex.fcon.type) — Types of [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]")*s* [[tab:lex.fcon.type]](./tab:lex.fcon.type)
| [🔗](#tab:lex.fcon.type-row-1)<br>**[*floating-point-suffix*](#nt:floating-point-suffix "5.13.4Floating-point literals[lex.fcon]")** | **type** |
| --- | --- |
| [🔗](#tab:lex.fcon.type-row-2)<br>none | double |
| [🔗](#tab:lex.fcon.type-row-3)<br>f or F | float |
| [🔗](#tab:lex.fcon.type-row-4)<br>l or L | long double |
| [🔗](#tab:lex.fcon.type-row-5)<br>f16 or F16 | std::float16_t |
| [🔗](#tab:lex.fcon.type-row-6)<br>f32 or F32 | std::float32_t |
| [🔗](#tab:lex.fcon.type-row-7)<br>f64 or F64 | std::float64_t |
| [🔗](#tab:lex.fcon.type-row-8)<br>f128 or F128 | std::float128_t |
| [🔗](#tab:lex.fcon.type-row-9)<br>bf16 or BF16 | std::bfloat16_t |
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L1752)
The [*significand*](#def:significand "5.13.4Floating-point literals[lex.fcon]") of a [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]") is the [*fractional-constant*](#nt:fractional-constant "5.13.4Floating-point literals[lex.fcon]") or [*digit-sequence*](#nt:digit-sequence "5.13.4Floating-point literals[lex.fcon]") of a [*decimal-floating-point-literal*](#nt:decimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]") or the [*hexadecimal-fractional-constant*](#nt:hexadecimal-fractional-constant "5.13.4Floating-point literals[lex.fcon]") or [*hexadecimal-digit-sequence*](lex.icon#nt:hexadecimal-digit-sequence "5.13.2Integer literals[lex.icon]") of a [*hexadecimal-floating-point-literal*](#nt:hexadecimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")[.](#2.sentence-1)
In the significand,
the sequence of [*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")*s* or [*hexadecimal-digit*](lex.icon#nt:hexadecimal-digit "5.13.2Integer literals[lex.icon]")*s* and optional period are interpreted as a base N real number s,
where N is 10 for a [*decimal-floating-point-literal*](#nt:decimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]") and
16 for a [*hexadecimal-floating-point-literal*](#nt:hexadecimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")[.](#2.sentence-2)
[*Note [2](#note-2)*:
Any optional separating single quotes are ignored when determining the value[.](#2.sentence-3)
— *end note*]
If an [*exponent-part*](#nt:exponent-part "5.13.4Floating-point literals[lex.fcon]") or [*binary-exponent-part*](#nt:binary-exponent-part "5.13.4Floating-point literals[lex.fcon]") is present,
the exponent e of the [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]") is the result of interpreting
the sequence of an optional [*sign*](#nt:sign "5.13.4Floating-point literals[lex.fcon]") and the [*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")*s* as a base 10 integer[.](#2.sentence-4)
Otherwise, the exponent e is 0[.](#2.sentence-5)
The scaled value of the literal iss×10e for a [*decimal-floating-point-literal*](#nt:decimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]") ands×2e for a [*hexadecimal-floating-point-literal*](#nt:hexadecimal-floating-point-literal "5.13.4Floating-point literals[lex.fcon]")[.](#2.sentence-6)
[*Example [1](#example-1)*:
The [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]")*s*49.625 and 0xC.68p+2 have the same value[.](#2.sentence-7)
The [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]")*s*1.602'176'565e-19 and 1.602176565e-19 have the same value[.](#2.sentence-8)
— *end example*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/lex.tex#L1786)
If the scaled value is not in the range of representable
values for its type, the program is ill-formed[.](#3.sentence-1)
Otherwise, the value of a [*floating-point-literal*](#nt:floating-point-literal "5.13.4Floating-point literals[lex.fcon]") is the scaled value if representable,
else the larger or smaller representable value nearest the scaled value,
chosen in an implementation-defined manner[.](#3.sentence-2)