Floating-Werte mit doppelter Genauigkeit in Python? [geschlossen]


83

Gibt es Datentypen mit besserer Genauigkeit als float?


3
Dies sind eigentlich zwei Fragen mit unterschiedlichen Antworten. 1: Werte mit doppelter Genauigkeit in Python sind Gleitkommazahlen, und 2: Ein Datentyp mit besserer Genauigkeit als Gleitkommazahl wäre dezimal. Können Fragen wie diese irgendwie geteilt werden? Die akzeptierten Antwortadressen Nr. 2, aber die am besten bewerteten Antwortadressen Nr. 1.
bsplosion

Antworten:


51

Dezimaler Datentyp

  • Im Gegensatz zu hardwarebasiertem binären Gleitkomma hat das Dezimalmodul eine vom Benutzer veränderbare Genauigkeit (standardmäßig 28 Stellen), die für ein bestimmtes Problem so groß sein kann, wie es erforderlich ist.

Wenn Sie unter Leistungsproblemen leiden, schauen Sie sich GMPY an


Wenn ich die ursprüngliche Frage stellen würde, wäre @ larsmans die Antwort (obwohl dies formal nicht zum Thema gehört).
Piotr Findeisen

@PiotrFindeisen wo ist diese Antwort?
Bitte helfen Sie

Keine Ahnung, aber jetzt würde ich mich auf @FredFoo beziehen. Im Allgemeinen "Floating-Werte mit doppelter Genauigkeit in Python?" → " float-s sind doppelte Präzision"
Piotr Findeisen

117

Der in Python integrierte floatTyp hat die doppelte Genauigkeit (es ist ein C doublein CPython, ein Java doublein Jython). Wenn Sie mehr Präzision benötigen, holen Sie sich NumPy und verwenden Sie es numpy.float128.


15
Anscheinend hat numpy.float128oft 64-Bit-Genauigkeit auf einem 64-Bit-System. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)kehrt zurück 0.0. Siehe stackoverflow.com/a/29821557/420755
Jeff

15

Für einige Anwendungen können Sie Fractionanstelle von Gleitkommazahlen verwenden.

>>> from fractions import Fraction
>>> Fraction(1, 3**54)
Fraction(1, 58149737003040059690390169)

(Für andere Anwendungen gibt es decimal, wie in den anderen Antworten vorgeschlagen.)


1
Wie wähle ich zwischen Dezimal und Bruch? Bruch scheint besser zu sein, da er fortlaufende Brüche darstellen kann, die Decimal wohl nicht kann?
Janus Troelsen

1
@ Janus: Berücksichtigen Sie Ihre Anforderungen und wählen Sie die aus, die besser zu ihnen passt. Verwenden DecimalSie diese Option, wenn Sie mit ungefähren Zahlen arbeiten möchten, die eine feste (aber konfigurierbare) Genauigkeit haben. Verwenden FractionSie diese Option, wenn Sie mit genauen Verhältnissen arbeiten möchten und bereit sind, die unbegrenzten Speicheranforderungen zu erfüllen.
Gareth Rees

Unterstützt Fraction alle Operationen, die Sie mit float ausführen können?
Danijar

13

Möglicherweise benötigen Sie Dezimal

>>> from decimal import Decimal    
>>> Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')

Gleitkomma-Arithmetik


0

Hier ist meine Lösung. Ich erstelle zuerst Zufallszahlen mit random.uniform, formatiere sie mit doppelter Genauigkeit in Zeichenfolgen und konvertiere sie dann zurück in float. Sie können die Genauigkeit anpassen, indem Sie '.2f' in '.3f' usw. ändern.

import random
from decimal import Decimal

GndSpeedHigh = float(format(Decimal(random.uniform(5, 25)), '.2f'))
GndSpeedLow = float(format(Decimal(random.uniform(2, GndSpeedHigh)), '.2f'))
GndSpeedMean = float(Decimal(format(GndSpeedHigh + GndSpeedLow) / 2, '.2f')))
print(GndSpeedMean)

Gut. Doppelte Genauigkeit bedeutet eine binäre Darstellung der Variablen mit doppelter Länge im Vergleich zur binären Darstellung von float. Nicht zwei Dezimalstellen.
Kravemir

Du hast recht. Ich habe möglicherweise schlechte Suchkriterien verwendet, als ich dieses Problem selbst hatte, und dies ist das Ergebnis. Einige andere suchen möglicherweise das gleiche Problem wie ich und landen hier. Hoffentlich finden sie etwas Erleichterung. :)
Bittikettu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.