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

83

Gibt es Datentypen mit besserer Genauigkeit als float?

Kravemir
quelle
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

Jakob
quelle
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.

Fred Foo
quelle
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.)

Gareth Rees
quelle
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

Springmaus
quelle
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)
Bittikettu
quelle
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