Continued fraction expansion is a simple way to approximate common trigonometry functions to a relatively high precision. In this example we only look at sin and cosine. The results compare well with the results of high precision packages like SymPy. The Python module decimal is used to achieve the high precision.

```
# approximate sin and cos using continued fraction expansion
# and module decimal to set higher precision
# convergence cutoff = 5 gives module math precision
# tested with Python27 by vegaseat
import decimal as dc
# for comparison
import math
try:
from sympy.mpmath import *
# set precision
mp.dps = 60
print(type(sin(0.5)))
print(sin(0.5))
print(cos(0.5))
print('-'*62)
except:
print("Install module SymPy from http://code.google.com/p/sympy")
def cont_fraction(r, cutoff=5):
"""
continued fraction expansion
higher convergence cutoff gives higher precision
but of course makes the approximation slower
"""
t = dc.Decimal(4)*cutoff + 2
for k in range(cutoff, 0, -1):
t = 4*k - 2 + dc.Decimal(r)/t
return t
def get_sin(x, cutoff=5):
"""returns an approximation of math.sin(x)"""
r = dc.Decimal(-x)*dc.Decimal(x)
s = cont_fraction(r, cutoff)
return 2*dc.Decimal(x)*s/(s*s - r)
def get_cos(x, cutoff=5):
"""returns an approximation of math.cos(x)"""
r = dc.Decimal(-x)*dc.Decimal(x)
s = cont_fraction(r, cutoff)
return (s*s + r)/(s*s - r)
# set decimal precision
dc.getcontext().prec = 60
# x is angle in radians
x = 0.5
print(type(get_sin(x)))
print(get_sin(x, 20))
print(math.sin(x))
# and some cosine approximations different cutoff values
print('-'*62)
print(get_cos(x, 15))
print(get_cos(x, 20))
print(get_cos(x, 25))
print(math.cos(x))
'''
<class 'sympy.mpmath.ctx_mp_python.mpf'>
0.479425538604203000273287935215571388081803367940600675188617
0.877582561890372716116281582603829651991645197109744052997611
--------------------------------------------------------------
<class 'decimal.Decimal'>
0.479425538604203000273287935215571388081803367940600675188618
0.479425538604
--------------------------------------------------------------
0.877582561890372716116281582603829651991645197109744053008284
0.877582561890372716116281582603829651991645197109744052997610
0.877582561890372716116281582603829651991645197109744052997610
0.87758256189
'''
```

TrustyTony
888
pyMod
Team Colleague
Featured Poster

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.