Exakten Wert beim Quadrieren von Floats (Python)?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Floats sind - unabhängig von der Programmiersprache - niemals genau, sondern IMMER nur Annäherungen!

Wenn etwas genau sein soll, MUSST du Integer nehmen.

Merke: Floats sind immer nur "ungefähr", mal mehr, mal weniger, aber genau sind sie - von Spezialfällen mal abgesehen - nie.

Woher ich das weiß:Berufserfahrung
JUCEL 
Fragesteller
 15.02.2021, 16:35

Das Problem ist, dass ich mit langen Kommazahlen rechnen muss. Es geht mir darum Parsec berechnen zu können, weshalb Kommazahlen unvermeidlich sind. Gibt es da keine Alternativen?

0
01df5e76  15.02.2021, 20:37
@JUCEL

Eine ohne die Installation von weiteren Bibliotheken durchführbare Alternative wäre diese:

>>> import decimal
>>> decimal.getcontext().prec = 200
>>> decimal.Decimal("128")**decimal.Decimal("0.5")
Decimal('11.313708498984760390413509793677584628557375003015584585413437903925859827696856310803100274621132581880110769847298376199398688446805897701152971976799486651305781327420044742046399604009222256484572')
>>>

Wobei daas Ergebnis natürlich keine 100%ige Genauigkeit hat, da jeder PC nur über eine endliche Menge Speicher verfügt und du wohl kaum Lust darauf hättest, unendlich lange auf das Ergebnis zu warten. ^^

2
JUCEL 
Fragesteller
 15.02.2021, 21:00
@01df5e76

Danke sehr für dieses schöne Beispiel :).

0
JUCEL 
Fragesteller
 15.02.2021, 21:04
@01df5e76

Ich habe meinen Code noch hinzugefügt

0

Problem Nummer 1: 128 ist keine Quadratzahl, daher ist die Quadratwurzel irrational.

Problem Nummer 2: Gleitkommazahlen sind nicht exakt.

Problem Nummer 3: Die Größe und damit die Genauigkeit von "Standard-Gleitkommazahlen" ist statisch begrenzt.

--------------------------------------

Aber das Hauptproblem ist Nummer 1: Eine irrationale Zahl hat in Dezimalschreibweise unendlich viele Nachkommastellen. Mit nur einer endlichen Teilmenge wird das Ergebnis also bestenfalls zufälligerweise korrekt.

Das ist kein Bug, da Wurzel 128 keine rationale (= mit einem Bruch darstellbare) Zahl ist und deswegen deine Zahl zum Quadrat auch gar nicht ganz genau 128 ergeben kann. Quelle: https://squareroot.info/number/square-root-of-128.html

Du kannst das Problem beheben, indem du entweder rundest, floor oder ceil benutzt, beziehungsweise die Anwendung veränderst.

Woher ich das weiß:Recherche

Der echte Zahlenwert hat natürlich ∞ viele Stellen. √127=11.31370849898476039041350979367758…

Dein Zahlenwert ist ist also notwendigerweise gerundet, und auch noch ungenau: √127≈11.313708498984761

Es ist also klar, daß beim Quadrieren etwas anderes als 127 herauskommen muß.