SLIDE 3 3
Implement Series Expansion
Think of each inside term as
sign = odd = 1;
sign = -sign;
) 9 1 7 1 5 1 3 1 1 ( 4
+ − + − ≅ π
sign 1
Implementing Taylor Series
− − − + − − − + ≅ ! 4 ) 1 ( 16 15 ! 3 ) 1 ( 8 3 ! 2 ) 1 ( 4 1 ) 1 ( 2 1 1
4 3 2
x x x x x
factorial xpower coeff
- Then, for next term
- xpower *= (x-1);
- factorial *= (i+1);
- coeff *= (0.5-i);
Taylor Algorithm
double TaylorSqrt(double x) { double sum, factorial, coeff, term, xpower; int i; factorial = coeff = xpower = term = 1.0; sum = 0.0; for (i = 0; sum != sum + term; i++) { sum += term; coeff *= (0.5 - i); xpower *= (x - 1); factorial *= (i + 1); term = coeff * xpower / factorial; } return sum; }
Fixing Limitation
- Taylor Series Approx works for 0 < x < 2
- How can we use it for larger x?
- Recall
x x x 2 4 4 = =
- Then divide by 4 until within range, then
calcuate sqrt, and multiply by 2’s to recover
- e.g. sqrt(24) = sqrt(4*4*1.5) = 2*2*sqrt(1.5)
Taylor Fix
double TSqrt(double x) { int mult = 1; if (x == 0) return (0); if (x < 0) { cout << "TSqrt of negative value " << x << endl; return 0; } while (x >= 2){ x /= 4; mult *= 2; } return mult * TaylorSqrt(x); }