Soweit ich mich an das Programmieren erinnere, wurde mir beigebracht, Gleitkommazahlen nicht auf Gleichheit zu vergleichen. Beim Lesen der Programmierung in Lua über den Lua- number
Typ stellte ich Folgendes fest:
Der Zahlentyp repräsentiert reelle Zahlen (Gleitkommazahlen mit doppelter Genauigkeit). Lua hat keinen Integer-Typ, da er ihn nicht benötigt. Es gibt ein weit verbreitetes Missverständnis über Gleitkomma-Rechenfehler und einige Leute befürchten, dass selbst ein einfaches Inkrement mit Gleitkommazahlen seltsam werden kann. Tatsache ist, dass bei Verwendung eines Double zur Darstellung einer Ganzzahl überhaupt kein Rundungsfehler auftritt (es sei denn, die Zahl ist größer als 100.000.000.000.000). Insbesondere kann eine Lua-Zahl jede lange ganze Zahl ohne Rundungsprobleme darstellen. Darüber hinaus führen die meisten modernen CPUs Gleitkomma-Arithmetik so schnell wie (oder sogar schneller als) Ganzzahl-Arithmetik aus.
Gilt das für alle Sprachen? Grundsätzlich sind wir in der Ganzzahlarithmetik sicher, wenn wir nicht über das Gleitkomma im Doppel hinausgehen. Oder, um mehr mit dem Fragentitel übereinzustimmen, gibt es etwas Besonderes, das Lua mit seinem number
Typ macht, damit es sowohl als Ganzzahl- als auch als Gleitkommatyp gut funktioniert?
quelle
Antworten:
Lua behauptet, dass Gleitkommazahlen ganzzahlige Zahlen genauso genau darstellen können wie ganzzahlige Typen, und ich bin geneigt, dem zuzustimmen. Es gibt keine ungenaue Darstellung eines gebrochenen numerischen Teils, mit dem man sich befassen muss. Unabhängig davon, ob Sie eine Ganzzahl in einem Ganzzahltyp oder in der Mantisse einer Gleitkommazahl speichern, ist das Ergebnis dasselbe: Diese Ganzzahl kann genau dargestellt werden, solange Sie die Anzahl der Bits in der Mantisse nicht überschreiten , + 1 Bit im Exponenten.
Wenn Sie versuchen, eine tatsächliche Gleitkommazahl (z. B. 12.345) in einer Gleitkommadarstellung zu speichern, sind natürlich alle Wetten deaktiviert. Ihr Programm muss also klar sein, dass die Zahl wirklich eine echte Ganzzahl ist, die die Zahl nicht überschreitet Mantisse, um sie wie eine tatsächliche ganze Zahl zu behandeln (dh in Bezug auf den Vergleich der Gleichheit).
Wenn Sie mehr Ganzzahlgenauigkeit benötigen, können Sie immer eine Bibliothek mit beliebiger Genauigkeit verwenden .
Weiterführende Literatur
Was ist der Maximalwert einer Zahl in Lua?
quelle
double
hat ungefähr 51 Mantissenbits; ungerade ganze Zahlen größer als ungefähr 2 ** 51 haben Rundungsfehler. Eine 64-Bit-Ganzzahl kann größere Ganzzahlwerte genau speichern, da sie keinem Exponenten Bits zuweist.Doppel werden als Mantisse und Exponent gespeichert. Weitere Informationen finden Sie im Format . Grundsätzlich haben alle Zahlen die Form: Mantisse * 2 Exponent . Für jede ganze Zahl kleiner als 2 52 ist der Exponent Null, wodurch die Mantisse Bit für Bit einer vorzeichenlosen 52-Bit-Ganzzahl entspricht. Ein separates Vorzeichenbit wird verwendet, um negative Zahlen anzuzeigen.
In der Tat, auch einige ganzen Zahlen größer als 2 52 genau dargestellt werden, solange alle Ziffern hinter den 52 nd sind Nullen. Außerdem können einige Brüche wie 0,5 genau dargestellt werden. Nur wenn sich der Bruch in Basis 2 kontinuierlich wiederholt (wie 1/3) oder auf andere Weise zu viele Bits hinter dem Radixpunkt benötigt werden, verlieren Sie an Präzision.
quelle