Python rechnet nicht mit zu kleinen Zahlen?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Keine zu kleinen Zahlen verwenden.

Ist in jeder Programmiersprache so, nicht nur Python. double/float hat eben nur eine begrenzte Genauigkeit.

Ich würde versuchen, das Programm irgendwie umzuschreiben, sodass es diese Rechnung vermeidet.

Eventuell geht's mit Decimal: https://docs.python.org/3/library/decimal.html

Edit: Das hat wohl auch nur 28 Stellen Genauigkeit, anstatt der von dir gewünschten 30. Wenndann musst du also -2.7136680169203194e-28 hernehmen.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

l1nxs 
Beitragsersteller
 25.09.2022, 00:24

danke

1
naitram22  25.09.2022, 00:24

Es müsste aber sicher auch einen Weg geben, um das mit sehr sehr kleinen Zahlen zu realisieren. Irgendwann nutzt man vielleicht ja doch mal eine

1
MrAmazing2  25.09.2022, 00:26
@naitram22

Man kann das Programm sicher irgendwie umschreiben, damit es nicht mit solchen kleinen Zahlen rechnet.

1
KarlRanseierIII  25.09.2022, 01:01

Nein, 28 ist nur der default, es sollte auch mehr gehen.

>>> a
Decimal('-2.7136680169203194E-30')
>>> b
Decimal('1')
>>> a+b
Decimal('0.9999999999999999999999999999972863319830796806')

Sieht auf den ersten Blick soweit okay aus.

0
MrAmazing2  25.09.2022, 01:12
@KarlRanseierIII

Wie hast du das gemacht?

from decimal import Decimal
a = Decimal('-2.7136680169203194E-30')
b = Decimal('1')
print(b - a)

Bei mir gibt er 1.000000000000000000000000000 aus

0
KarlRanseierIII  25.09.2022, 03:51
@MrAmazing2

Exemplarisch:

>>> con=decimal.Context(prec=128)
>>> decimal.setcontext(con)
......

Oder den Beispielen der Doku folgend, alles zusammen:

>>> import decimal
>>> decimal.getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> decimal.getcontext().prec=512
>>> decimal.getcontext()
Context(prec=512, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> a = decimal.Decimal('-2.7136680169203194E-30')
>>> b = decimal.Decimal(1)
>>> print(a+b)
0.9999999999999999999999999999972863319830796806
1