[python-nl] grote getallen met grote precisie

Remco Gerlich remco at gerlich.nl
Tue May 5 07:44:47 CEST 2009


Hoi,

Ik heb er gisteren ook mee gespeeld, en de truc is:

decimal.getcontext().prec = 1000

Je kunt de precisie zelf instellen! Standaard is het 28 cijfers.

from decimal import *
getcontext().prec = 1000
a = Decimal('1e22')
c = Decimal('1e22')+Decimal('1')

b = (c*c-a*a).sqrt()

Geeft het juiste antwoord (b is afgerond 141421356237, groter dan ik had
verwacht :-))

Remco

2009/5/4 Robert-Reinder Nederhoed <r.r.nederhoed op gmail.com>

> No luck so far...
>
> >>> from decimal import Decimal
> >>> a = Decimal(10) ** Decimal(80)
> >>> b = a + Decimal(1)
> >>> b
> Decimal('1.000000000000000000000000000E+80')
> >>> 10 ** 80
>
> 100000000000000000000000000000000000000000000000000000000000000000000000000000000
>
> bij Decimal gaat het 1 eentje al verloren voordat we de wortel trekken.
>
> >>> from fractions import Fraction
> >>> a = Fraction(10**100)
> >>> b = 1 + a
> >>> b
>
> Fraction(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001,
> 1)
> >>> (b ** Fraction(2)) ** Fraction(1, 2)
> 1e+100
>
> De implementatie van power en sqrt gebruiken intern floating points zo te
> zien.
>
> > Leuk. Kun je vertellen waar je integers vandaan komen [..]
> Ik werk een eigen compressie idee uit. Tot nu toe wordt mijn bestand
> alleen maar groter :-)
> Nou dat is niet helemaal waar, maar ik probeer met grotere brokken
> data te werken en nu loop ik tegen grenzen aan.
>
>
> Ik heb al even gespeeld met een implementatie van sqrt die enkel
> integers oplevert, maar die begint bij getallen groter dan 10**7 tijd
> te vragen...
>
> def sqrt(x):
>    """ via http://www.pedrofreire.com/sqrt
>    >>> sqrt(4)
>    2
>    >>> sqrt(144)
>    12
>    >>> sqrt((10**6 + 1) ** 2)
>    1000001
>    """
>    x = (x+1) >> 1
>    r = 0
>    while x > r:
>        x -= r
>        r += 1
>    return r
>
>
> hum... ik ga er nog even over nadenken. Misschien dat ik eerst met
> blokken ga werken van 30 cijfers in float128. Of mijn idee anders
> opzetten.
>
> Lastig. Bedankt voor nu, goede nacht!
> _______________________________________________
> Python-nl mailing list
> Python-nl op python.org
> http://mail.python.org/mailman/listinfo/python-nl
>
------------- volgend deel ------------
Een HTML-bijlage is gescrubt...
URL: <http://mail.python.org/pipermail/python-nl/attachments/20090505/647bedfe/attachment-0001.htm>


More information about the Python-nl mailing list