On 9/8/06, kirby urner <[EMAIL PROTECTED]> wrote:

> And definitely use generators.  The fibonacci sequence is a fantastic
> place to begin, even if your school is a "no da vinci code" zone, sort
> of the way mine is (we got sick of it after a whole year of hype).

Per convergent generators, here's one for cosine:

def cosgen(x):
        """
        convergent summation to cosine(x)
        factorial defined off camera
        """
        thesum = 0
        n = 0
        sign = 1
        while True:
                thesum += (sign * pow(x, 2*n)) / fact(2*n)
                yield thesum
                n += 1
                sign = -sign

>>> from math import cos
>>> target = cos(14.21)

>>> target
-0.072768683554320104

>>> thegen = cosgen(14.21)
>>> while abs(target - thegen.next())>0.000001:  pass

>>> thegen.next()
-0.072768693540998033

Now this is a little bit dangerous, but if you're certain of
convergence and want to catch when the floating point value is no
longer changing, you can get away with:

>>> while (thegen.next() <> thegen.next()):  pass

>>> thegen.next()
-0.072768683575483162

>>> target
-0.072768683554320104

So we notice some disagreement here.

What if we go to more precision?

def cosgen(x):
        thesum = Decimal(0)
        n = Decimal(0)
        sign = Decimal(1)
        two = Decimal(2)
        while True:
                thesum += (sign * pow(x,two*n))/fact(two*n)
                yield thesum
                n += 1
                sign = -sign


>>> from decimal import *
>>> getcontext().prec = 30
>>> var = Decimal(14.21)
                
>>> thegen = cosgen(var)
>>> thegen.next()
Decimal("1")

>>> while (thegen.next() <> thegen.next()):  pass
>>> thegen.next()
Decimal("-0.0727686835543192487699552024271")

>>> target
-0.072768683554320104

Still a disrepancy, but I'm thinking the generator is now more
precise.  Let's push out further:

>>> getcontext().prec = 100
>>> thegen = cosgen(var)
>>> while (thegen.next() <> thegen.next()):  pass

>>> thegen.next()
Decimal("-0.07276868355431924876995437627048855025971011082339833272762148823931248781362040259253050759451593338")

OK, so it looks like math.cosine is only accurate up to
-0.0727686835543 then rounding error.

Kirby
_______________________________________________
Edu-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/edu-sig

Reply via email to