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.
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.
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.)
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')
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.
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. :)
Antworten:
Dezimaler Datentyp
Wenn Sie unter Leistungsproblemen leiden, schauen Sie sich GMPY an
quelle
float
-s sind doppelte Präzision"Der in Python integrierte
float
Typ hat die doppelte Genauigkeit (es ist ein Cdouble
in CPython, ein Javadouble
in Jython). Wenn Sie mehr Präzision benötigen, holen Sie sich NumPy und verwenden Sie esnumpy.float128
.quelle
numpy.float128
oft 64-Bit-Genauigkeit auf einem 64-Bit-System.numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)
kehrt zurück0.0
. Siehe stackoverflow.com/a/29821557/420755Für einige Anwendungen können Sie
Fraction
anstelle 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.)quelle
Decimal
Sie diese Option, wenn Sie mit ungefähren Zahlen arbeiten möchten, die eine feste (aber konfigurierbare) Genauigkeit haben. VerwendenFraction
Sie diese Option, wenn Sie mit genauen Verhältnissen arbeiten möchten und bereit sind, die unbegrenzten Speicheranforderungen zu erfüllen.Möglicherweise benötigen Sie Dezimal
>>> from decimal import Decimal >>> Decimal(2.675) Decimal('2.67499999999999982236431605997495353221893310546875')
Gleitkomma-Arithmetik
quelle
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)
quelle