Wie groß ist der Präzisionsverlust, der lange zu verdoppeln ist?

8

Ich habe in verschiedenen Post auf Stackoverflow und in der C # -Dokumentation gelesen, dass das Konvertieren von long (oder eines anderen Datentyps, der eine Zahl darstellt) in double die Genauigkeit verliert. Dies ist offensichtlich aufgrund der Darstellung von Gleitkommazahlen.

Meine Frage ist: Wie groß ist der Genauigkeitsverlust, wenn ich eine größere Zahl in double umwandle? Muss ich Unterschiede erwarten, die größer als +/- X sind?

Der Grund, warum ich das wissen möchte, ist, dass ich mich mit einem kontinuierlichen Zähler beschäftigen muss, der ein long ist. Dieser Wert wird von meiner Anwendung als string gelesen, muss gecastet werden und muss z. 10 oder eine andere kleine Nummer und wird dann weiter verarbeitet.

Würde decimal für diese Aufgabe besser geeignet sein?

    
John 25.09.2015, 14:00
quelle

2 Antworten

8
  

Das Konvertieren von long (oder eines anderen Datentyps, der eine Zahl darstellt) in double verliert die Genauigkeit. Dies ist offensichtlich aufgrund der Darstellung von Gleitkommazahlen.

Dies ist weniger offensichtlich als es scheint, da der Präzisionsverlust vom Wert von long abhängt. Für Werte zwischen -2 <52> und <52> gibt es überhaupt keinen Präzisionsverlust.

  

Wie groß ist der Genauigkeitsverlust, wenn ich eine größere Zahl in eine doppelte umwandele? Muss ich mit größeren Abweichungen rechnen als +/- X

?

Bei Zahlen mit einer Stärke über 2 52 werden Sie einen Präzisionsverlust erleiden, abhängig davon, wie viel Sie über die 52-Bit-Grenze hinausgehen. Wenn der absolute Wert von long beispielsweise in 58 Bits passt, ist die Größe des Präzisionsverlusts 58-52 = 6 Bits oder +/- 64.

  

Würde decimal für diese Aufgabe besser geeignet sein?

decimal hat eine andere Darstellung als double und verwendet eine andere Basis. Da Sie planen, Ihre Nummer durch "kleine Zahlen" zu teilen, würden verschiedene Darstellungen Ihnen unterschiedliche Fehler bei der Division geben. Genauer gesagt ist double besser bei der Division durch Potenzen von zwei (2, 4, 8, 16 usw.), da eine solche Division durch Subtrahieren vom Exponenten erreicht werden kann, ohne die Mantisse zu berühren. In ähnlicher Weise würde ein großer decimal s keinen Verlust von signifikanten Ziffern erleiden, wenn er durch zehn, hundert usw. dividiert wird.

    
dasblinkenlight 25.09.2015, 14:17
quelle
3

long

long ist ein 64-Bit-Integer-Typ und kann Werte von -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 (max. 19 Ziffern) enthalten.

double

double ist ein 64-Bit-Gleitkommatyp mit einer Genauigkeit von 15 bis 16 Ziffern. So können Daten sicher verloren gehen, wenn Ihre Zahlen größer als 100.000.000.000.000 sind.

decimal

decimal ist ein 128-Bit-Dezimaltyp und kann bis zu 28-29 Ziffern enthalten. Es ist also immer sicher, long auf decimal zu setzen.

Empfehlung

Ich würde Ihnen raten, die genauen Erwartungen über die Zahlen herauszufinden, mit denen Sie arbeiten werden. Dann können Sie eine fundierte Entscheidung bei der Auswahl des geeigneten Datentyps treffen. Da Sie Ihre Zahlen aus einer Zeichenfolge lesen, ist es nicht möglich, dass sie sogar größer als 28 Ziffern sind? In diesem Fall funktioniert keiner der aufgeführten Typen für Sie und Sie müssen stattdessen eine BigInt-Implementierung verwenden.

    
Dmytro Shevchenko 25.09.2015 14:12
quelle

Tags und Links