Last time: | Next time: |
Today:
Today we're going to finish off chapter 2 (one way or the other!). That means that we'll be starting into Chapter 3 next time: please read into it. We're going to be considering root-finding.
In this section the authors describe the manner in which numbers are stored in the computer. They focus on "floating-point numbers", which are represented by three parts:
Definition 2.1: A real number is said to be an n-digit number if it can be expressed as
Question: They then ask "What's an n-bit number?" (p. 39) What do you tell them?
Let's imagine that our machine has base-10 architecture, with , and . Then we know exactly which numbers may be represented: numbers from
Largest magnitude numbers | -9.999x109 | +9.999x109 |
Smallest magnitude numbers | -1.000x10-9 | +1.000x10-9 |
Failure to include the denormalized numbers (that don't have a leading 1) leads to a gap around zero in this figure:
We see that the smallest positive number representable is 1/4. The smallest subdivision is 1/16. It seems that 4 may not be representable. What might be the toy machine representation architecture?
On the downside, if we allowed non-zero leading digits, then there would be redundant representations for many numbers (e.g. +1.000x10-9=+0.100x10-8)
Now, in reality, computations are usually done in base 2, and the IEEE standard for single precision and double precision are
Single | Double | |
Base | 2 | 2 |
n | 24 | 53 |
e | [-126:127] | [-1022:1023] |
Question: in each case, how many exponents are there in the exponent range? Of what significance are these numbers (or numbers close, rather...)?
Question: let's see if we can make sense of this system with this particular example:
;; 0 01111100 01000000000000000000000 ;; + power of 2 mantissa (significand) ;; ;; The first bit of the mantissa is an implied 1 (normalized form). ;; ;; Since the powers of 2 are all positive, we have to shift the exponent to get ;; both positive and negative exponents. The IEEE standard is to subtract 127 ;; from the exponent. ;;
Our authors describe the difference between precision and accuracy at this point: I think that it's best done graphically:
"The purpose of rounding in computation is to turn any real number into a machine number, preferably the nearest one." (p. 43)
But there are different ways to do it. You're no doubt familiar with rounding (but how do you handle ties -- that is, how do we round 19.5 to an integer?). The authors suggest several strategies (p. 43):
"Round-to-even" because if nth digit is even, do nothing; add 1 if odd, making it even. All nth digits become even.
Same as Rule 1, except when exactly equal to 500000....
then round UP (away from zero).
Inferior to Rule 1, as ever-so-slightly biased away from zero.
Whatever comes after nth, just drop it.
Inferior to Rule 1, as slightly biased toward zero.
The biases are illustrated nicely in Figure 2.5, p. 45:
The chopping approximations are all under-estimates; the rounding methods give more balanced overs and unders; but the rounding alone has a bias for giving overestimates, which rounding-to-even balances out.
There is some vocabulary here with which we should be familiar: sometimes rounding results in
Definitions:
The authors make the case that
where
Examples:
By "basic operations" the authors mean using standard arithmetic operations on machine numbers to produce machine numbers. There will be errors.
Let a and b be machine numbers, and let represent any of the standard arithmetic operations. Then
I.e., to compute one of these binary operations with machine numbers, you do the operation exactly, and then convert it to a machine number with float (fl). We already know what this will cost: we'll have a roundoff error of .
As we compute more complicated function, however, with one unary or binary operation after another, the errors continue to accumulate (as seen for example, in section 2.4.5, p. 54).
Examples:
(a) 0.6668+0.3334 | (b) 1000.-0.05001 |
(c) 2.000*0.6667 | (d) 25.00/16.00 |
This section features several interesting examples of functions, some of them tremendously important, which are also extraordinarily sensitive to errors.
The authors define numerical instability as "unacceptably large amplification of computational errors in an algorithm."
One of the main points of the section is that a "solution" to a problem may be technically correct, analytically correct, and yet poorly designed to produce good results in general.
Let's go through the example problem on pages 62-63. It's a simple calculation, but illustrates how the reasonable can go awry (answer is .00082713 to one more digit).
An excellent example is the quadratic formula. Many of you have memorized it as
We can imagine situations, however, for which this calculation may be dangerous. What do you notice?
What about that difference inside the square root? The authors assert that "cancellation inside the radical is not easily avoided" (p. 65), and yet just below that remark they note that
is better conditioned when . So what COULD we do (if we wished....)?
Examples:
If not, and we must use 1.4, then another user would assume that we only know the 4 in the tenths place to within five units, and you can see what happens to the actual uncertainty -- it expands grossly, to the interval (0.9,1.9).
The speed of light in a vacuum.
When
and, in particular, when , i.e. when
Symmetrically, subtraction will suffer the problem when a and b are approximately equal.