Lecture 26 (Powerpoint)

Download Report

Transcript Lecture 26 (Powerpoint)

Real Number Representation
(Lecture 25 of the Introduction to Computer Programming series)
Dr Damian Conway
Room 132
Building 26
Some Terminology
• All digits in a number following any
leading zeros are significant digits:
12.345
-0.12345
0.00012345
Some Terminology
• The scientific notation for real
numbers is:
mantissa  base
exponent
Some Terminology
• The mantissa is always normalized
between 1 and the base (i.e. exactly one
significant figure before the point):
Normalized
8
2.9979  10
12
B.139FC  16
-3
1.0110110101  2
Unnormalized
5
2997.9  10
11
B1.39FC  16
-1
0.010110110101  2
Some Terminology
• The precision of a number is how many
digits (or bits) we use to represent it.
• For example:
3
3.14
3.1415926
3.141592653589793238462643383279
5028
Representing numbers
• A real number n is represented by a
floating-point approximation n*
• The computer uses 32 bits (or more) to
store each approximation.
• It needs to store the mantissa, the sign
of the mantissa, and the exponent (with
its sign).
Representing numbers
• So it has to allocate some of its 32 bits
to each task.
• The standard way to do this (specified
by IEEE standard 754) is:
Representing numbers
• 23 bits for the mantissa;
• 1 bit for the mantissa's sign (i.e. the
mantissa is signed magnitude);
• The remaining 8 bits for the exponent.
Representing numbers
• 23 bits for the mantissa;
• 1 bit for the mantissa's sign (i.e. the
mantissa is signed magnitude);
• The remaining 8 bits for the exponent.
31 30
23 22
0
Representing numbers
• 23 bits for the mantissa;
• 1 bit for the mantissa's sign (i.e. the
mantissa is signed magnitude);
• The remaining 8 bits for the exponent.
31 30
23 22
0
Representing numbers
• 23 bits for the mantissa;
• 1 bit for the mantissa's sign (i.e. the
mantissa is signed magnitude);
• The remaining 8 bits for the exponent.
31 30
23 22
0
Representing the mantissa
• Since the mantissa has to be in the
range 1 ≤ mantissa < base, if we use
base 2 the digit before the decimal has
to be a 1.
• So we don't have to worry about storing
it!
• That way we get 24 bits of precision
using only 23 bits.
Representing the mantissa
• Those 24 bits of precision are
equivalent to a little over 7 decimal
digits:
24
 7.2
log 2 10
Representing the mantissa
• Suppose we want to represent :
3.141592653589793238462643383279
5.....
• That means that we can only represent
it as:
3.141592 (if we truncate)
3.141593 (if we round)
Representing the mantissa
• Even if the computer appears to give
you more than seven decimal places,
only the first seven are meaningful.
• For example:
#include <math.h>
main()
{
float pi = 2 * asin(1);
printf("%.35f\n", pi);
}
Representing the mantissa
• On my machine this prints out:
3.1415927419125732000000000000000000
Representing the mantissa
• On my machine this prints out:
3.1415927419125732000000000000000000
Representing the exponent
• The exponent is represented as an
excess-127 number.
• That is:
00000000
00000001
01111111
10000000
11111111





–127
–126
0
+1
+128
Representing the exponent
• However, the IEEE standard restricts
exponents to the range:
–126 ≤ exponent ≤ +127
• The exponents –127 and +128 have
special meanings (basically, zero and
infinity respectively)
Floating point overflow
• Just like the integer representations in
the previous lecture, floating point
representations can overflow:
9.999999  10127
+ 1.111111  10127
1.1111110  10128
Floating point overflow
• Just like the integer representations in
the previous lecture, floating point
representations can overflow:
9.999999  10127
+ 1.111111  10127
1.1111110  10128
Floating point overflow
• Just like the integer representations in
the previous lecture, floating point
representations can overflow:
9.999999  10127
+ 1.111111  10127
∞
Floating point underflow
• But floating point numbers can also get
too small:
1.000000  10-126
÷ 2.000000  100
5.000000  10-127
Floating point underflow
• But floating point numbers can also get
too small:
1.000000  10-126
÷ 2.000000  100
5.000000  10-127
Floating point underflow
• But floating point numbers can also get
too small:
1.000000  10-126
÷ 2.000000  100
0
Floating point addition
• Five steps to add two floating point
numbers:
– Express them with the same exponent
(denormalize)
– Add the mantissas
– Adjust the mantissa to one digit/bit before
the point (renormalize)
– Round or truncate to required precision.
– Check for overflow/underflow
Floating point addition example
x = 9.876  107
y = 1.357  106
Floating point addition example
1. Same exponents:
x = 9.876  107
y = 0.1357  107
Floating point addition example
2. Add mantissas:
x = 9.876  107
y = 0.1357  107
x+y = 10.0117  107
Floating point addition example
3. Renormalize sum:
x = 9.876  107
y = 0.1357  107
x+y = 1.00117  108
Floating point addition example
4. Trucate or round:
x = 9.876  107
y = 0.1357  107
x+y = 1.001  108
Floating point addition example
5. Check overflow and underflow:
x = 9.876  107
y = 0.1357  107
x+y = 1.001  108
Floating point addition example 2
x = 3.506  10-5
y = -3.497  10-5
Floating point addition example 2
1. Same exponents:
x = 3.506  10-5
y = -3.497  10-5
Floating point addition example 2
2. Add mantissas:
x = 3.506  10-5
y = -3.497  10-5
x+y = 0.009  10-5
Floating point addition example 2
3. Renormalize sum:
x = 3.506  10-5
y = -3.497  10-5
x+y = 9.000  10-8
Floating point addition example 2
4. Trucate or round:
x = 3.506  10-5
y = -3.497  10-5
x+y = 9.000  10-8
(no change)
Floating point addition example 2
5. Check overflow and underflow:
x = 3.506  10-5
y = -3.497  10-5
x+y = 9.000  10-8
Floating point addition example 2
Question: should we believe these
zeroes?
x = 3.506  10-5
y = -3.497  10-5
x+y = 9.000  10-8
Floating point multiplication
• Five steps to multiply two floating point
numbers:
– Multiply mantissas
– Add exponents
– Renormalize mantissa
– Round or truncate to required precision.
– Check for overflow/underflow
Floating point multiplication
example
x = 9.001  105
y = 8.001  10-3
Floating point multiplication
example
1&2. Multiply mantissas/add exponents:
x = 9.001  105
y = 8.001  10-3
x  y = 72.017001  102
Floating point multiplication
example
3. Renormalize product:
x = 9.001  105
y = 8.001  10-3
x  y = 7.2017001  103
Floating point multiplication
example
4. Trucate or round:
x = 9.001  105
y = 8.001  10-3
x  y = 7.201  103
Floating point multiplication
example
4. Trucate or round:
x = 9.001  105
y = 8.001  10-3
x  y = 7.202  103
Floating point multiplication
example
5. Check overflow and underflow:
x = 9.001  105
y = 8.001  10-3
x  y = 7.202  103
Limitations
• Float-point representations only
approximate real numbers.
• The normal laws of arithmetic don't
always hold (even less often than for
integer representations).
• For example, associativity is not
guaranteed:
Limitations
x = 3.002  103
y = -3.000  103
z = 6.531  100
Limitations
x = 3.002  103
x+y = 2.000  100
y = -3.000  103
z = 6.531  100
Limitations
x = 3.002  103
x+y = 2.000  100
y = -3.000  103
(x+y)+z = 8.531  100
z = 6.531  100
Limitations
x = 3.002  103
y = -3.000  103
z = 6.531  100
Limitations
x = 3.002  103
y = -3.000  103
y+z = -2.993  103
z = 6.531  100
Limitations
x = 3.002  103
x+(y+z) = 0.009  103
y = -3.000  103
y+z = -2.993  103
z = 6.531  100
Limitations
x = 3.002  103
x+(y+z) = 9.000  100
y = -3.000  103
y+z = -2.993  103
z = 6.531  100
Limitations
x = 3.002  103
x+(y+z) = 9.000  100
y = -3.000  103
(x+y)+z = 8.531  100
z = 6.531  100
Limitations
• Consider the other laws of arithmetic:
–
–
–
–
Commutativity (additive and multiplicative)
Associativity
Distributivity
Identity (additive and multiplicative)
• Spend some time working out which
ones (if any!) always hold for floatingpoint numbers.
Reading (for the very keen)
Goldberg, D., What Every Computer
Scientist Should Know About FloatingPoint Arithmetic, ACM Computing
Surveys, Vol.23, No.1, March 1991.