Single-precision floating-point format (sometimes called FP32 or float32) is a
computer number format, usually occupying
32 bits in
computer memory
Computer memory stores information, such as data and programs, for immediate use in the computer. The term ''memory'' is often synonymous with the terms ''RAM,'' ''main memory,'' or ''primary storage.'' Archaic synonyms for main memory include ...
; it represents a wide
dynamic range of numeric values by using a
floating radix point.
A floating-point variable can represent a wider range of numbers than a
fixed-point variable of the same bit width at the cost of precision. A
signed 32-bit
integer
An integer is the number zero (0), a positive natural number (1, 2, 3, ...), or the negation of a positive natural number (−1, −2, −3, ...). The negations or additive inverses of the positive natural numbers are referred to as negative in ...
variable has a maximum value of 2
31 − 1 = 2,147,483,647, whereas an
IEEE 754
The IEEE Standard for Floating-Point Arithmetic (IEEE 754) is a technical standard for floating-point arithmetic originally established in 1985 by the Institute of Electrical and Electronics Engineers (IEEE). The standard #Design rationale, add ...
32-bit base-2 floating-point variable has a maximum value of (2 − 2
−23) × 2
127 ≈ 3.4028235 × 10
38. All integers with seven or fewer decimal digits, and any 2
''n'' for a whole number −149 ≤ ''n'' ≤ 127, can be converted exactly into an IEEE 754 single-precision floating-point value.
In the IEEE 754
standard, the 32-bit base-2 format is officially referred to as binary32; it was called single in
IEEE 754-1985. IEEE 754 specifies additional floating-point types, such as 64-bit base-2 ''
double precision
Double-precision floating-point format (sometimes called FP64 or float64) is a floating-point arithmetic, floating-point computer number format, number format, usually occupying 64 Bit, bits in computer memory; it represents a wide range of numeri ...
'' and, more recently, base-10 representations.
One of the first
programming language
A programming language is a system of notation for writing computer programs.
Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
s to provide single- and double-precision floating-point data types was
Fortran. Before the widespread adoption of IEEE 754-1985, the representation and properties of floating-point data types depended on the
computer manufacturer and computer model, and upon decisions made by programming-language designers. E.g.,
GW-BASIC
GW-BASIC is a dialect of the BASIC programming language developed by Microsoft from IBM BASICA. Functionally identical to BASICA, its BASIC interpreter is a fully self-contained executable and does not need the Cassette BASIC ROM found in the ori ...
's single-precision data type was the
32-bit MBF floating-point format.
Single precision is termed ''REAL'' in
Fortran; ''SINGLE-FLOAT'' in
Common Lisp; ''float'' in
C,
C++,
C# and
Java
Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
; ''Float'' in
Haskell and
Swift;
and ''Single'' in
Object Pascal (
Delphi
Delphi (; ), in legend previously called Pytho (Πυθώ), was an ancient sacred precinct and the seat of Pythia, the major oracle who was consulted about important decisions throughout the ancient Classical antiquity, classical world. The A ...
),
Visual Basic Visual Basic is a name for a family of programming languages from Microsoft. It may refer to:
* Visual Basic (.NET), the current version of Visual Basic launched in 2002 which runs on .NET
* Visual Basic (classic), the original Visual Basic suppo ...
, and
MATLAB. However, ''float'' in
Python,
Ruby,
PHP, and
OCaml and ''single'' in versions of
Octave before 3.2 refer to
double-precision numbers. In most implementations of
PostScript, and some
embedded systems, the only supported precision is single.
IEEE 754 standard: binary32
The IEEE 754 standard specifies a ''binary32'' as having:
*
Sign bit: 1 bit
*
Exponent width: 8 bits
*
Significand precision: 24 bits (23 explicitly stored)
This gives from 6 to 9
significant decimal digits precision. If a decimal string with at most 6 significant digits is converted to the IEEE 754 single-precision format, giving a
normal number, and then converted back to a decimal string with the same number of digits, the final result should match the original string. If an IEEE 754 single-precision number is converted to a decimal string with at least 9 significant digits, and then converted back to single-precision representation, the final result must match the original number.
The sign bit determines the sign of the number, which is the sign of the significand as well. "1" stands for negative. The exponent field is an 8-bit unsigned integer from 0 to 255, in
biased form: a value of 127 represents the actual exponent zero. Exponents range from −126 to +127 (thus 1 to 254 in the exponent field), because the biased exponent values 0 (all 0s) and 255 (all 1s) are reserved for special numbers (
subnormal numbers,
signed zeros,
infinities, and
NaNs).
The true significand of normal numbers includes 23 fraction bits to the right of the binary point and an ''
implicit leading bit'' (to the left of the binary point) with value 1. Subnormal numbers and zeros (which are the floating-point numbers smaller in magnitude than the least positive normal number) are represented with the biased exponent value 0, giving the implicit leading bit the value 0. Thus only 23 fraction bits of the
significand appear in the memory format, but the total precision is 24 bits (equivalent to log
10(2
24) ≈ 7.225 decimal digits) for normal values; subnormals have gracefully degrading precision down to 1 bit for the smallest non-zero value.
The bits are laid out as follows:
The real value assumed by a given 32-bit ''binary32'' data with a given ''sign'', biased exponent ''E'' (the 8-bit unsigned integer), and a ''23-bit fraction'' is
:
,
which yields
:
In this example:
*
,
*
,
*
,
*
,
*