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
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.
Misschien ken je dit
No luck so far...
>>> from decimal import Decimal
>>> a = Decimal(10) ** Decimal(80)
>>> b = a + Decimal(1)
>>> b
Decimal('1.000E+80')
>>> 10 ** 80
1
bij Decimal gaat het 1 eentje al verloren v
Op 4 mei 2009 20:35 heeft Robert-Reinder Nederhoed
het volgende geschreven:
> Voor de komma, achter de komma is oninteressant voor mijn functie. Ik
> begin met hele grote integers, voer daar bewerkingen op uit en wil dan
> terugrekenen.
Leuk. Kun je vertellen waar je integers vandaan komen, en w
Heren, bedankt voor het meedenken. numpy.float128 kende ik nog niet, thanks!
Wellicht doe ik rare dingen... maar ik wil juist rekenen met getallen
van 1000 cijfers (of meer) :-) en de waarde zit 'm juist in de
afwijking tussen 2 hele grote getallen.
Die 1 in het voorbeeld is juist heel belangrijk.
Mijn probleem in de kern is dit:
a = 1 + 10**22
a
101L
a**2
10201L
(a**2)**0.5
1e+22
Je kunt je ook afvragen of je de precisie werkelijk nodig hebt. In
alle praktische gevallen kun je volgens mij gewoon aannemen:
>>> a = 1e22+1
Overigens heeft numpy nog een float128 type, maar ook daar zul je
vinden dat
a = numpy.float128(1e22+1)
b = numpy.float128(1e22)
a == b
True
Niet valsspelen, je moet de optelling natuurlijk wel in float128 doen
en niet in Python float (64).
Oeps, even over het hoofd gezien.
En ik denk dat
> Overigens heeft numpy nog een float128 type, maar ook daar zul je vinden dat
a = numpy.float128(1e22+1)
b = numpy.float128(1e22)
a == b
> True
Niet valsspelen, je moet de optelling natuurlijk wel in float128 doen
en niet in Python float (64). 64 bit floats met 53 bit mantissa zijn
Hoi,
2009/5/4 Rob Hooft :
> Nee, de beste optie is om het niet met informatica maar met wiskundige
> algebra op te lossen. Het algoritme zo kiezen dat je een grotere
> nauwkeurigheid intrinsiek behoudt.
De vraag ging expliciet over een float-alternatief. Van decimal en
fractions lijkt me fraction
@Martijn: dank, ik ga vanavond de Fraction uitproberen
@Rob: dank voor je reactie. Ik begrijp je punt. Het is alleen lastig
om dit probleem met een ander algoritme op te lossen.
Mijn probleem in de kern is dit:
>>> a = 1 + 10**22
>>> a
101L
>>> a**2
1020
Nee, de beste optie is om het niet met informatica maar met wiskundige
algebra op te lossen. Het algoritme zo kiezen dat je een grotere
nauwkeurigheid intrinsiek behoudt.
In plaats van c**2-b**2 moet je dan bijvoorbeeld (c-b)*(c+b)
berekenen; ontzettend veel makkelijker.
Rob
Op 4 mei 2009 13:38
Hoi,
2009/5/4 Robert-Reinder Nederhoed :
> Is er een float-alternatief die een zekere precisie behoudt?
http://docs.python.org/library/fractions.html
http://docs.python.org/library/decimal.html
Het lijkt me dat fractions het beste bij een wiskundig probleem als deze passen.
Groeten,
Martijn
_
Goedemiddag! Ik wil de korte zijde van een hele lange, smalle
rechthoekige driehoek berekenen, daarbij gebruik ik Pythagoras met
grote getallen:
c = (a**2 + b**2) ** 0.5
Waarbij:
c == 1 + 10**22 (schuine zijde)
a == 10**22 (rechte zijde)
Het antwoord zou moeten volgen uit:
b = (c**2 - b**2) ** 0
13 matches
Mail list logo