CPSC/MATH 402 - Computer Exercises

Investigating Floating Point Arithmetic and Error in Numerical Computations

Log into the Linux system to do this exercise. This handout and some programs are on-line -- go to http://cs.roanoke.edu/Spring2004/CPSC402A (use the Mozilla browser) and click on the link to lab 1.

  1. The program tenth.cc illustrates the hazards of testing for equality of two floating point numbers.

    Do the following:

    1. Save the program to your directory (you can do this by clicking on the link to the program and then using the File/Save As feature in the browser -- or copy and paste).
    2. Compile and run the program. The commands are:
              g++ tenth.cc -o ten
      
      to compile and put the executable in a file named ten (you may choose another name for the executable!). To run type
             ./ten 
      
      (you need the ./ to refer to your current directory). Alternately, use the command
             g++ tenth.cc
      
      to compile then ./a.out to run (a.out is the default name for executables in UNIX).

    3. Run the program with the following input: (a) n = 8; (b) n = 6; (c) n = 4096; (d) n = 10. (Remember that CTRL-C means break in UNIX!!) What happened and why was the behavior different for different input?
    4. Change the loop control to total > epsilon (epsilon is already computed -- it is the approximation to machine epsilon which is a measure of machine precision -- discussed in Section 1.3.5 of the text). Rerun the program for the input above plus other values. Does it work correctly?

  2. Suppose you need to evaluate the function f(x) = (x - sin(x))/x^3 for values of x close to 0. The program sine.cc evaluates the function for values of x starting with x = 1 then dividing by 10 each iteration (so x becomes 0.1, then 0.01, 0.001, etc). The user enters the number of iterations. According to L'Hopital's rule, the limit of f(x) as x approaches 0 is 1/6 so the values should be close to 1/6 as x gets close to 0.

    1. Save the program, compile it and run it for 16 iterations. What happened? Why do you think the program behaved as it did?
    2. Find a second way of calculating (or approximating) f(x) and add code to the program to perform the calculation and print out the result in a third column (leave the original calculation -- declare a new variable). Run your program to make sure it does a better job (if it doesn't try again!!!).

  3. Do computer problem #1.6(b) on page 45. Part (a) gives two ways to compute a sequence of equally spaced points in an interval [a, b]. For part(b) you are to write a program to implement these to see which is best. You may use either Java or C++.

  4. The program poly.cc is essentially Computer Problem 1.14 on page 47 (it just prints values rather than plotting them). Save it to your directory.

    1. Read the problem and the program then compile and run the program. Study the output. Notice the difference in answers for the two different calculations. Also notice the computed value of (x - 1)^6 for x = 1.
    2. The later problem is related to what you were supposed to understand from doing #1.6. Modify the program using what you learned from #1.6 so the answer for x = 1 is correct.
    3. The expanded form of the polynomial did not fare so well in the above calculations. In general, a polynomial should not be evaluated in expanded form but not all polynomials have nice factored forms. The recommended method of evaluation (in the absence of a nice factorization) is called Horner's method (which your book tells you about on page 316). Horner's method uses a nested evaluation. See the general formula on page 316. For this particular polynomial, Horner's method is
              1 + x(-6 + x(15 + x(-20 + x(15+ x(-6 + x))))
      
      Add code to the program to evaluate the polynomial this way (assign to poly3) and print out the result (as a fourth column).

HOMEWORK DUE Tuesday, January 27, 2004:

  1. Why did the input 10 cause problems in the tenth.cc program but 8 and 4096 worked as expected?

  2. For Computer Problem 1.6,
    1. What did you use as an example to illustrate the difference between the two methods?
    2. How different were the results (compute the largest absolute error and the largest relative error you got)?
    3. Which method was better?
    4. Why do you think it was better?

  3. In Computer Problem #1.14, discuss the behavior for the three different methods for computing (x - 1)^6 for x near 1. Explain and compare the behavior of the three methods as follows.
    1. For what values of x do the three methods give very similar answers and for what values do the methods give very different answers?
    2. Compare the methods -- which is best? which is worst? How do you know?
    3. Were the different answers close enough that any one of the methods would have been acceptable to use?
    4. Use the formula for approximating the condition number of a function to get a formula for the condition number of f(x) = (x - 1)^6.
    5. Find the condition number for a value of at least one x for which the results of the three computations were very different.
    6. Find the condition number for a value of at least one x for which the results of the three computations were close.
    7. Does the condition number help explain the observed behavior of the three methods of computing f(x)? Explain.
Also hand in a copy of your program sine.cc, the program for Problem 1.6 and poly.cc.

Printing and Getting Output: To print use the nenscript command printing in two columns (uses less paper!!!). The command is

     nenscript -2rG filename
where "filename" is the name of the file you want to print.

To get output to examine either use redirection of output or create a script file. For example, to put the output of tenth.cc in a file named tenth.out you can run the program with the following command (assuming the executable is named ten:

      ./ten > ten.out
This sends all output, including the prompts, to the file ten.out. You need to type in the input without the benefit of the prompts.

To put the output in a logfile (or script) named ten.out you would issue the following sequence of commands:

     script ten.out
     ./ten
     exit
With either technique the output file can be examined using the more command, edited in emacs, or printed.