I agree with KeithF that the figure on page 8 is not the same as that on page 9 which is 33.42.
Also, on page 35, I am not sure if this is another error:
For the bisection method, right near the end of the algorithm, it says "The final value of x3 approximates the root, and it is in error by not more than |x1 - x2|/2".
My understanding of the algorithm is that the last iteration of the loop would still set either x1 or x2 equal to x3.
To simplify, say you have an initial interval [0, 1] and you only run 1 iteration. Let's assume that the true value of the root is 0.1.
So you have, in the one and only iteration, x3 = (x1 + x2)/2 = (0 + 1)/2 = 0.5
Since the root is 0.1 you'd have that f(x3)*f(x1) < 0 so you'd set x2 = x3 for the next iteration. This makes sense as the new interval is [0.0, 0.5]
However, we've assumed 1 iteration for simplicity, in the code we'd have that |x1 - x2| < 2*tolerance so the loop would stop.
So at the end you have:
x1 = 0.0 (not changed by single iteration in the loop)
x2 = 0.5 (set to be equal to x3 for next loop that never happens)
x3 = 0.5 (halfway between two starting values)
|x1 - x2|/2 = |0 - 0.5|/2 = 0.25
Now the actual absolute error is |root - x3| = |0.1 - 0.5| = 0.4 > 0.25, contradicting the text book.
Also, this appears to be inconsistent with page 37 which gives