IEEE 754-1985[1] is a historic industrystandard for representingfloating-point numbers incomputers, officially adopted in 1985 and superseded in 2008 byIEEE 754-2008, and then again in 2019 by minor revisionIEEE 754-2019.[2] During its 23 years, it was the most widely used format for floating-point computation. It was implemented in software, in the form of floating-pointlibraries, and in hardware, in theinstructions of manyCPUs andFPUs. The firstintegrated circuit to implement the draft of what was to become IEEE 754-1985 was theIntel 8087.
IEEE 754-1985 represents numbers inbinary, providing definitions for four levels of precision, of which the two most commonly used are:
| Level | Width | Range at fullprecision | Precision[a] |
|---|---|---|---|
| Single precision | 32 bits | ±1.18×10−38 to ±3.4×1038 | Approximately 7 decimal digits |
| Double precision | 64 bits | ±2.23×10−308 to ±1.80×10308 | Approximately 16 decimal digits |
The standard also defines representations for positive and negativeinfinity, a "negative zero", five exceptions to handle invalid results likedivision by zero, special values calledNaNs for representing those exceptions,denormal numbers to represent numbers smaller than shown above, and fourrounding modes.


Floating-point numbers in IEEE 754 format consist of three fields: asign bit, abiased exponent, and a fraction. The following example illustrates the meaning of each.
The decimal number 0.1562510 represented in binary is 0.001012 (that is, 1/8 + 1/32). (Subscripts indicate the numberbase.) Analogous toscientific notation, where numbers are written to have a single non-zero digit to the left of the decimal point, we rewrite this number so it has a single 1 bit to the left of the "binary point". We simply multiply by the appropriate power of 2 to compensate for shifting the bits left by three positions:
Now we can read off the fraction and the exponent: the fraction is .012 and the exponent is −3.
As illustrated in the pictures, the three fields in the IEEE 754 representation of this number are:
IEEE 754 adds abias to the exponent so that numbers can in many cases be compared conveniently by the same hardware that compares signed2's-complement integers. Using a biased exponent, the lesser of two positive floating-point numbers will come out "less than" the greater following the same ordering as forsign and magnitude integers. If two floating-point numbers have different signs, the sign-and-magnitude comparison also works with biased exponents. However, if both biased-exponent floating-point numbers are negative, then the ordering must be reversed. If the exponent were represented as, say, a 2's-complement number, comparison to see which of two numbers is greater would not be as convenient.
The leading 1 bit is omitted since all numbers except zero start with a leading 1; the leading 1 is implicit and doesn't actually need to be stored which gives an extra bit of precision for "free."
The number zero is represented specially:
The number representations described above are callednormalized, meaning that the implicit leading binary digit is a 1. To reduce the loss of precision when anunderflow occurs, IEEE 754 includes the ability to represent fractions smaller than are possible in the normalized representation, by making the implicit leading digit a 0. Such numbers are calleddenormal. They don't include as manysignificant digits as a normalized number, but they enable a gradual loss of precision when the result of anoperation is not exactly zero but is too close to zero to be represented by a normalized number.
A denormal number is represented with a biased exponent of all 0 bits, which represents an exponent of −126 in single precision (not −127), or −1022 in double precision (not −1023).[3] In contrast, the smallest biased exponent representing a normal number is 1 (seeexamples below).
The biased-exponent field is filled with all 1 bits to indicate either infinity or an invalid result of a computation.
Positive and negative infinity are represented thus:
Some operations offloating-point arithmetic are invalid, such as taking the square root of a negative number. The act of reaching an invalid result is called a floating-pointexception. An exceptional result is represented by a special code called a NaN, for "Not a Number". All NaNs in IEEE 754-1985 have this format:

Precision is defined as the minimum difference between two successive mantissa representations; thus it is a function only in the mantissa; while the gap is defined as the difference between two successive numbers.[4]
Single-precision numbers occupy 32 bits. In single precision:
Some example range and gap values for given exponents in single precision:
| Actual Exponent (unbiased) | Exp (biased) | Minimum | Maximum | Gap |
|---|---|---|---|---|
| −1 | 126 | 0.5 | ≈ 0.999999940395 | ≈ 5.96046e-8 |
| 0 | 127 | 1 | ≈ 1.999999880791 | ≈ 1.19209e-7 |
| 1 | 128 | 2 | ≈ 3.999999761581 | ≈ 2.38419e-7 |
| 2 | 129 | 4 | ≈ 7.999999523163 | ≈ 4.76837e-7 |
| 10 | 137 | 1024 | ≈ 2047.999877930 | ≈ 1.22070e-4 |
| 11 | 138 | 2048 | ≈ 4095.999755859 | ≈ 2.44141e-4 |
| 23 | 150 | 8388608 | 16777215 | 1 |
| 24 | 151 | 16777216 | 33554430 | 2 |
| 127 | 254 | ≈ 1.70141e38 | ≈ 3.40282e38 | ≈ 2.02824e31 |
As an example, 16,777,217 cannot be encoded as a 32-bit float as it will be rounded to 16,777,216. However, all integers within the representable range that are a power of 2 can be stored in a 32-bit float without rounding.
Double-precision numbers occupy 64 bits. In double precision:
Some example range and gap values for given exponents in double precision:
| Actual Exponent (unbiased) | Exp (biased) | Minimum | Maximum | Gap |
|---|---|---|---|---|
| −1 | 1022 | 0.5 | ≈ 0.999999999999999888978 | ≈ 1.11022e-16 |
| 0 | 1023 | 1 | ≈ 1.999999999999999777955 | ≈ 2.22045e-16 |
| 1 | 1024 | 2 | ≈ 3.999999999999999555911 | ≈ 4.44089e-16 |
| 2 | 1025 | 4 | ≈ 7.999999999999999111822 | ≈ 8.88178e-16 |
| 10 | 1033 | 1024 | ≈ 2047.999999999999772626 | ≈ 2.27374e-13 |
| 11 | 1034 | 2048 | ≈ 4095.999999999999545253 | ≈ 4.54747e-13 |
| 52 | 1075 | 4503599627370496 | 9007199254740991 | 1 |
| 53 | 1076 | 9007199254740992 | 18014398509481982 | 2 |
| 1023 | 2046 | ≈ 8.98847e307 | ≈ 1.79769e308 | ≈ 1.99584e292 |
The standard also recommends extended format(s) to be used to perform internal computations at a higher precision than that required for the final result, to minimise round-off errors: the standard only specifies minimum precision and exponent requirements for such formats. Thex8780-bit extended format is the most commonly implemented extended format that meets these requirements.
Here are some examples of single-precision IEEE 754 representations:
| Type | Sign | Actual Exponent | Exp (biased) | Exponent field | Fraction field | Value |
|---|---|---|---|---|---|---|
| Zero | 0 | −126 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 |
| Negative zero | 1 | −126 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0000 | −0.0 |
| One | 0 | 0 | 127 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.0 |
| Minus One | 1 | 0 | 127 | 0111 1111 | 000 0000 0000 0000 0000 0000 | −1.0 |
| Smallestdenormalized number | * | −126 | 0 | 0000 0000 | 000 0000 0000 0000 0000 0001 | ±2−23 × 2−126 = ±2−149 ≈ ±1.4×10−45 |
| "Middle" denormalized number | * | −126 | 0 | 0000 0000 | 100 0000 0000 0000 0000 0000 | ±2−1 × 2−126 = ±2−127 ≈ ±5.88×10−39 |
| Largest denormalized number | * | −126 | 0 | 0000 0000 | 111 1111 1111 1111 1111 1111 | ±(1−2−23) × 2−126 ≈ ±1.18×10−38 |
| Smallest normalized number | * | −126 | 1 | 0000 0001 | 000 0000 0000 0000 0000 0000 | ±2−126 ≈ ±1.18×10−38 |
| Largest normalized number | * | 127 | 254 | 1111 1110 | 111 1111 1111 1111 1111 1111 | ±(2−2−23) × 2127 ≈ ±3.4×1038 |
| Positive infinity | 0 | 128 | 255 | 1111 1111 | 000 0000 0000 0000 0000 0000 | +∞ |
| Negative infinity | 1 | 128 | 255 | 1111 1111 | 000 0000 0000 0000 0000 0000 | −∞ |
| Not a number | * | 128 | 255 | 1111 1111 | non zero | NaN |
| * Sign bit can be either 0 or 1 . | ||||||
Every possible bit combination is either a NaN or a number with a unique value in theaffinely extended real number system with its associated order, except for the two combinations of bits for negative zero and positive zero, which sometimes require special attention (see below). Thebinary representation has the special property that, excluding NaNs, any two numbers can be compared assign and magnitude integers (endianness issues apply). When comparing as2's-complement integers: If the sign bits differ, the negative number precedes the positive number, so 2's complement gives the correct result (except that negative zero and positive zero should be considered equal). If both values are positive, the 2's complement comparison again gives the correct result. Otherwise (two negative numbers), the correct FP ordering is the opposite of the 2's complement ordering.
Rounding errors inherent to floating point calculations may limit the use of comparisons for checking the exact equality of results. Choosing an acceptable range is a complex topic. A common technique is to use a comparison epsilon value to perform approximate comparisons.[6] Depending on how lenient the comparisons are, common values include1e-6 or1e-5 for single-precision, and1e-14 for double-precision.[7][8] Another common technique is ULP, which checks what the difference is in the last place digits, effectively checking how many steps away the two values are.[9]
Although negative zero and positive zero are generally considered equal for comparison purposes, someprogramming languagerelational operators and similar constructs treat them as distinct. According to theJava Language Specification,[10] comparison and equality operators treat them as equal, butMath.min() andMath.max() distinguish them (officially starting with Java version 1.1 but actually with 1.1.1), as do the comparison methodsequals(),compareTo() and evencompare() of classesFloat andDouble.
The IEEE standard has four different rounding modes; the first is the default; the others are calleddirected roundings.
The IEEE standard employs (and extends) theaffinely extended real number system, with separate positive and negative infinities. During drafting, there was a proposal for the standard to incorporate theprojectively extended real number system, with a single unsigned infinity, by providing programmers with a mode selection option. In the interest of reducing the complexity of the final standard, the projective mode was dropped, however. TheIntel 8087 andIntel 80287 floating point co-processors both support this projective mode.[11][12][13]
The following functions must be provided:
NaN for anyx (includingNaN).copysign(x,y) returns x with the sign of y, soabs(x) equalscopysign(x,1.0). This is one of the few operations which operates on a NaN in a way resembling arithmetic. The functioncopysign is new in the C99 standard.scalb(y, N)logb(x)finite(x) apredicate for "x is a finite value", equivalent to −Inf < x < Infisnan(x) a predicate for "x is a NaN", equivalent to "x ≠ x"x <> y (x .LG. y inFortran), which turns out to have different behavior thanNOT(x = y) (x .NE. y in Fortran,x != y inC)[14] due to NaN.unordered(x, y) is true when "x is unordered with y", i.e., either x or y is a NaN.class(x)nextafter(x,y) returns the next representable value from x in the direction towards yIn 1976,Intel was starting the development of a floating-pointcoprocessor.[15][16] Intel hoped to be able to sell a chip containing good implementations of all the operations found in the widely varying maths software libraries.[15][17]
John Palmer, who managed the project, believed the effort should be backed by a standard unifying floating point operations across disparate processors. He contactedWilliam Kahan of theUniversity of California, who had helped improve the accuracy ofHewlett-Packard's calculators. Kahan suggested that Intel use the floating point ofDigital Equipment Corporation's (DEC) VAX. The first VAX, theVAX-11/780 had just come out in late 1977, and its floating point was highly regarded. However, seeking to market their chip to the broadest possible market, Intel wanted the best floating point possible, and Kahan went on to draw up specifications.[15] Kahan initially recommended that the floating point base be decimal[18][unreliable source?] but the hardware design of the coprocessor was too far along to make that change.
The work within Intel worried other vendors, who set up a standardization effort to ensure a "level playing field". Kahan attended the second IEEE 754 standards working group meeting, held in November 1977. He subsequently received permission from Intel to put forward a draft proposal based on his work for their coprocessor; he was allowed to explain details of the format and its rationale, but not anything related to Intel's implementation architecture. The draft was co-written with Jerome Coonen andHarold Stone, and was initially known as the "Kahan-Coonen-Stone proposal" or "K-C-S format".[15][16][17][19]
As an 8-bit exponent was not wide enough for some operations desired for double-precision numbers, e.g. to store the product of two 32-bit numbers,[20] both Kahan's proposal and a counter-proposal by DEC therefore used 11 bits, like the time-tested60-bit floating-point format of theCDC 6600 from 1965.[16][19][21] Kahan's proposal also provided for infinities, which are useful when dealing with division-by-zero conditions; not-a-number values, which are useful when dealing with invalid operations;denormal numbers, which help mitigate problems caused by underflow;[19][22][23] and a better balancedexponent bias, which can help avoid overflow and underflow when taking the reciprocal of a number.[24][25]
Even before it was approved, the draft standard had been implemented by a number of manufacturers.[26][27] The Intel 8087, which was announced in 1980, was the first chip to implement the draft standard.

In 1980, theIntel 8087 chip was already released,[28] but DEC remained opposed, to denormal numbers in particular, because of performance concerns and since it would give DEC a competitive advantage to standardise on DEC's format.
The arguments overgradual underflow lasted until 1981 when an expert hired byDEC to assess it sided against the dissenters. DEC had the study done in order to demonstrate that gradual underflow was a bad idea, but the study concluded the opposite, and DEC gave in. In 1985, the standard was ratified, but it had already become the de facto standard a year earlier, implemented by many manufacturers.[16][19][5]