Difference between revisions of "cpp/language/floating literal"
(Showed full value) |
|||
Line 59: | Line 59: | ||
{{example|code= | {{example|code= | ||
#include <iostream> | #include <iostream> | ||
+ | #include <iomanip> | ||
#include <limits> | #include <limits> | ||
#include <cassert> | #include <cassert> |
Revision as of 10:26, 12 April 2022
Floating-point literal defines a compile-time constant whose value is specified in the source file.
Contents |
Syntax
digit-sequence decimal-exponent suffix(optional) | (1) | ||||||||
digit-sequence . decimal-exponent(optional) suffix(optional)
|
(2) | ||||||||
digit-sequence(optional) . digit-sequence decimal-exponent(optional) suffix(optional)
|
(3) | ||||||||
0x | 0X hex-digit-sequence hex-exponent suffix(optional)
|
(4) | (since C++17) | |||||||
0x | 0X hex-digit-sequence . hex-exponent suffix(optional)
|
(5) | (since C++17) | |||||||
0x | 0X hex-digit-sequence(optional) . hex-digit-sequence hex-exponent suffix(optional)
|
(6) | (since C++17) | |||||||
decimal-exponent has the form
e | E exponent-sign(optional) digit-sequence
|
|||||||||
hex-exponent has the form
p | P exponent-sign(optional) digit-sequence
|
(since C++17) | ||||||||
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 ( |
(since C++14) |
Explanation
Decimal scientific notation is used, meaning that the value of the floating-point literal is the significand multiplied by the number 10 raised to the power of decimal-exponent. E.g. the mathematical meaning of 123e4 is 123×104.
If the floating literal begins with the character sequence 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.4p3; // hex fraction 1.4 (decimal 1.25) scaled by 2^3, that is 10.0 |
(since C++17) |
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.
Example
#include <iostream> #include <iomanip> #include <limits> #include <cassert> #include <typeinfo> int main() { std::cout << "Literal " << "Printed value" << "\n58. " << 58. // double << "\n4e2 " << 4e2 // double << "\n123.456e-67 " << 123.456e-67 // double << "\n123.456e-67f " << 123.456e-67f // float, truncated to zero << "\n.1E4f " << .1E4f // float << "\n0x10.1p0 " << 0x10.1p0 // double << "\n0x1p5 " << 0x1p5 // double << "\n0x1e5 " << 0x1e5 // integer literal, not floating-point << "\n3.14'15'92 " << 3.14'15'92 // double, single quotes ignored (C++14) << "\n1.18e-4932l " << 1.18e-4932l // long double << "\n1.18e-4932 " << 1.18e-4932 // double, truncated to zero << "\n3.4028234e38f " << std::setprecision(39) << 3.4028234e38f // float << '\n'; assert(3.402823'4e38f == std::numeric_limits<float>::max()); assert(3.402823'4e38f == 3.402823'5e38f); // left ends in 4, right ends in 5 assert(3.402823'4e38 != 3.402823'5e38); }
Possible output:
Literal Printed value 58. 58 4e2 400 123.456e-67 1.23456e-65 123.456e-67f 0 .1E4f 1000 0x10.1p0 16.0625 0x1p5 32 0x1e5 485 3.14'15'92 3.14159 1.18e-4932l 1.18e-4932 1.18e-4932 0 3.4028234e38f 340282346638528859811704183484516925440
See also
user-defined literals(C++11) | literals with user-defined suffix |
C documentation for Floating constant
|