PureBytes Links
Trading Reference Links
|
The attachment describes the IEEE floating point storage format
used by Wintel.
You will note that it can exactly store an integer value up to
(2**24)-1, which is 16,772,215. This is why single precision is
said to represent about 7 decimal digits of accuracy. It can store
exactly any 7 decimal digit number, and a few 8 digit numbers.
So if any of your calculations need more accuracy than that
(either final answer or intermediate results), then the answer
will be subject to some rounding.
Rod
Title: The IEEE standard for floating point arithmetic
The IEEE standard for floating point arithmetic
The IEEE (Institute of Electrical and Electronics Engineers) has produced
a standard for floating point arithmetic. This standard specifies how single
precision (32 bit) and double precision (64 bit) floating point numbers
are to be represented, as well as how arithmetic should be carried out
on them.
Single Precision
The IEEE single precision floating point standard representation requires
a 32 bit word, which may be represented as numbered from 0 to 31, left
to right. The first bit is the sign bit, S, the next eight bits are the
exponent bits, 'E', and the final 23 bits are the fraction 'F':
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31
The value V represented by the word may be determined as follows:
If E=255 and F is nonzero, then V=NaN ("Not a number")
If E=255 and F is zero and S is 1, then V=-Infinity
If E=255 and F is zero and S is 0, then V=Infinity
If 0<E<255 then V=(-1)**S * 2 ** (E-127) * (1.F) where "1.F" is intended
to represent the binary number created by prefixing F with an implicit
leading 1 and a binary point.
If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-126) * (0.F) These are
"unnormalized" values.
If E=0 and F is zero and S is 1, then V=-0
If E=0 and F is zero and S is 0, then V=0
In particular,
0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0
0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity
0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN
0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5
0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127)
0 00000000 00000000000000000000001 = +1 * 2**(-126) *
0.00000000000000000000001 =
2**(-149) (Smallest positive value)
Double Precision
The IEEE double precision floating point standard representation requires
a 64 bit word, which may be represented as numbered from 0 to 63, left
to right. The first bit is the sign bit, S, the next eleven bits are the
exponent bits, 'E', and the final 52 bits are the fraction 'F':
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1 11 12 63
The value V represented by the word may be determined as follows:
If E=2047 and F is nonzero, then V=NaN ("Not a number")
If E=2047 and F is zero and S is 1, then V=-Infinity
If E=2047 and F is zero and S is 0, then V=Infinity
If 0<E<2047 then V=(-1)**S * 2 ** (E-1023) * (1.F) where "1.F" is
intended to represent the binary number created by prefixing F with an
implicit leading 1 and a binary point.
If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-1022) * (0.F) These are
"unnormalized" values.
If E=0 and F is zero and S is 1, then V=-0
If E=0 and F is zero and S is 0, then V=0
For an ordinary IEEE floating point number, the value is given by
value =(-1)sign ×
2(exponent-127) × (1 + fraction).
For regular IEEE 64-bit floating point numbers, the value is given by
value=(-1)sign × 2(exponent-1023)
×
(1+fraction).
Fraction bytes are in order of decreasing significance (i.e., the standard
non-byte-swapped order).
For example, suppose the single precision 8-bit byte pattern is 40400000.
The sign bit is 0, the exponent bit pattern is 100 0000 0
(or 128), and the fraction pattern is 1 followed by 22 0s
with a binary point in front, or 0.5 decimal. The entire number is interpreted
as
(-1)° × 2(128-127)
× 1.5 = 3.
Reference:
ANSI/IEEE Standard 754-1985,
Standard for Binary Floating Point Arithmetic
|