# floating point literal

< cpp‎ | language

C++
 Language Headers Named requirements Language support library Concepts library (C++20) Diagnostics library Utilities library Strings library Containers library Algorithms library Iterators library Numerics library Input/output library Localizations library Regular expressions library (C++11) Atomic operations library (C++11) Thread support library (C++11) Filesystem library (C++17) Technical Specifications

Expressions
 General value categories (lvalue, rvalue, xvalue) order of evaluation (sequence points) constant expressions unevaluated expressions primary expressions lambda-expression(C++11) Literals integer literals floating-point literals boolean literals character literals including escape sequences string literals null pointer literal(C++11) user-defined literal(C++11) Operators Assignment operators: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b Increment and decrement: ++a, --a, a++, a-- Arithmetic operators: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<>b Logical operators: a||b, a&&b, !a Comparison operators: a==b, a!=b, ab, a<=b, a>=b, a<=>b(C++20) Member access operators: a[b], *a, &a, a->b, a.b, a->*b, a.*b Other operators: a(...), a,b, a?b:c Default comparisons(C++20) Alternative representations of operators Precedence and associativity Fold expression(C++17) new-expression delete-expression throw-expression alignof sizeof sizeof...(C++11) typeid noexcept(C++11) Operator overloading Conversions Implicit conversions const_cast static_cast reinterpret_cast dynamic_cast Explicit conversions (T)a, T(a) User-defined conversion

Floating point literal defines a compile-time constant whose value is specified in the source file.

## Contents

### Syntax

 digit-sequence exponent suffix(optional) (1) digit-sequence . exponent(optional) suffix(optional) (2) digit-sequence(optional) . digit-sequence exponent(optional) suffix(optional) (3) 0x | 0X hex-digit-sequence exponent suffix(optional) (4) (since C++17) 0x | 0X hex-digit-sequence . exponent suffix(optional) (5) (since C++17) 0x | 0X hex-digit-sequence(optional) . hex-digit-sequence exponent suffix(optional) (6) (since C++17)
1) digit-sequence representing a whole number without a decimal separator, in this case the exponent is not optional: 1e10, 1e-5L
2) digit-sequence representing a whole number with a decimal separator, in this case the exponent is optional: 1., 1.e-2
3) digit-sequence representing a fractional number. The exponent is optional: 3.14, .1f, 0.1e-1L
4) Hexadecimal digit-sequence representing a whole number without a radix separator. The exponent is never optional for hexadecimal floating-point literals: 0x1ffp10, 0X0p-1
5) Hexadecimal digit-sequence representing a whole number with a radix separator. The exponent is never optional for hexadecimal floating-point literals: 0x1.p0, 0xf.p-1
6) Hexadecimal digit-sequence representing a fractional number with a radix separator. The exponent is never optional for hexadecimal floating-point literals: 0x0.123p-1, 0xa.bp10l

The exponent has the form

 e | E exponent-sign(optional) digit-sequence (1) p | P exponent-sign(optional) digit-sequence (2) (since C++17)
1) The exponent syntax for a decimal floating-point literal
2) The exponent syntax for hexadecimal floating-point literal

exponent-sign, if present, is either + or -

suffix, if present, is one of f, F, l, or L. The suffix determines the type of the floating-point literal:

• (no suffix) defines double
• f F defines float
• l L defines long double
 Optional single quotes(') can be inserted between the digits as a separator, they are ignored when compiling. (since C++14)

### Explanation

Decimal scientific notation is used, meaning that the value of the floating-point literal is the significand mutiplied by the number 10 raised to the power of exponent. The mathematical meaning of 123e4 is 123×104

 If the floating literal begins with the character sequence 0x or 0X, the floating literal is a hexadecimal floating literal. Otherwise, it is a decimal floating literal. For a hexadecimal floating literal, the significand is interpreted as a hexadecimal rational number, and the digit-sequence of the exponent is interpreted as the integer power of 2 to which the significand has to be scaled. double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 (since C++17)

### Example

#include <iostream>
int main()
{
std::cout << 58.         << '\n'
<< 4e2         << '\n'
<< 123.456e-67 << '\n'
<< .1E4f       << '\n'
<< 0x10.1p0    << '\n';
}

Output:

58
400
1.23456e-65
1000
16.0625

### Notes

The hexadecimal floating-point literals were not part of C++ until C++17, although they can be parsed and printed by the I/O functions since C++11: both C++ I/O streams when std::hexfloat is enabled and the C I/O streams: std::printf, std::scanf, etc. See std::strtof for the format description