The problem with the previous error bounds is that they are in terms of quantities like \(\sum|a_{i}|\), which are not known in advance, and hard to compute (well, you certainly wouldn’t want to compute them with floating point arithmetic!).
For Horner’s Rule, there is an algorithm that helps:
- Let \(r=a_{n}\)
- Let \(s=o(|a_{n}|/2)\)
- For i = n-1 down to 1 (inclusive?):
- \(r=o(o(rx)+a_{i})\)
- $s=o(o(s|x|)+|r|)
- (This is Horner’s rule, more or less)
- \(r=o(o(rx)+a_{0})\)
- \(b=o(2o(s|x|)+|r|)\)
- \(b=\mathbf{u}o(b/(1-(2n-1)\mathbf{u}))\)
Now \(r\) contains the value of the polynomial at \(x\) (with errors), and \(b\) is an upper bound on the error. Both are floating point numbers.
Note: One can use FMA in the algorithm above.
The number of flops for this is \(4n+1\) (vs \(2n\) for the plain Horner’s Rule). The reason for the more flops is the addition of absolute value and factors of 2.
Now for proof that the algorithm works.
Let \(r_{i}\) be the value of \(r\) after the \(i\) iteration. Then \(r_{i}=o(o(r_{i+1}x)+a_{i})\). (Remember we are going backwards) This is for \(i<n\). For \(n,r_{n}=a_{n}\). Using the standard models, we have:
(Note I used both of the equations in the standard model to get this).
Define \(q_{i}=\sum_{h=i}^{n}a_{h}x^{h-i}\). This is the “correct” value of \(r_{i}\). Define \(e_{i}=r_{i}-q_{i}\). Note that \(e_{n}=0\). Also note that \(q_{i}=q_{i+1}x+a_{i}\). Using these, we can show:
Taking absolute values:
Now:
\(E_{0}=0\) and \(E_{i}=(E_{i+1}+|r_{i+1}|)|x|+|r_{i}|\). This leads to:
Or
where
This is a polynomial of degree \(n-1\), and has non-negative coefficients. Therefore, \(S(|x|)\le s(1+\mathbf{u})^{2n-2}\) where \(s\) is the floating point number you get from the algorithm. Then use the last theorem in the previous section to get the conclusion.
To be frank, I got bored halfway and didn’t verify the last few steps.