Heim >Backend-Entwicklung >C++ >Können alle ganzzahligen Werte perfekt als Doubles dargestellt werden?
Werden alle ganzzahligen Werte perfekt als Doubles dargestellt?
Es stellt sich die Frage, ob alle ganzzahligen Werte garantiert eine perfekte Darstellung als haben Gleitkommazahlen mit doppelter Genauigkeit. Um dies zu beantworten, befassen wir uns zunächst mit der Darstellung von Duplikaten.
Doubles werden als Mantisse * 2^Exponent dargestellt, wobei die Mantisse Nachkommastellen enthält. Dies ermöglicht die Darstellung sowohl ganzzahliger als auch dezimaler Werte.
Darstellung von 32-Bit-Ganzzahlen
Für 32-Bit-Ganzzahlen stehen bis zu 53 Bits zur Verfügung die Mantisse. Dies reicht aus, um alle möglichen 32-Bit-Ganzzahlen ohne Bruchverlust darzustellen. Also ja, alle 32-Bit-Ganzzahlwerte werden perfekt als Doubles dargestellt.
Darstellung von 64-Bit-Ganzzahlen
Bei 64-Bit-Ganzzahlen ist die Situation jedoch anders ist anders. IEEE 754 mit doppelter Genauigkeit kann eine perfekte Darstellung für bis zu 53 Bit garantieren. Darüber hinaus kann es zu Rundungsfehlern kommen. Daher nein, nicht alle 64-Bit-Ganzzahlwerte werden perfekt als Doppelzahlen dargestellt.
Empirische Überprüfung des Verhaltens
Der folgende Codeausschnitt testet die Konvertierung von Ganzzahlen in Doppelzahlen :
<code class="cpp">#include <iostream> #include <limits> using namespace std; int main() { double test; volatile int test_int; for (int i = 0; i < numeric_limits<int>::max(); i++) { test = i; test_int = test; if (test_int != i) cout << "found integer i=" << i << ", test=" << test << endl; } return 0; }</code>
Das Ausführen dieses Codes zeigt, dass es keine ganzzahligen Werte mit gebrochenen Konvertierungsfehlern für 32-Bit-Ganzzahlen gibt. Für 64-Bit-Ganzzahlen ist es jedoch möglich, ganzzahlige Werte zu finden, die in Doppelwerte mit gebrochenen Differenzen umgewandelt und auf den ursprünglichen ganzzahligen Wert zurückgerundet werden.
Bruchzahldifferenzen
Bezüglich der Möglichkeit gebrochener Differenzen bei der Konvertierung lautet die Antwort für ganze Zahlen immer noch Nein. Dies liegt daran, dass die Schrittweite zwischen Doppelwerten, dargestellt als Mantisse * 2^Exponent, immer eine Zweierpotenz ist. Daher gibt es zwischen zwei Double-Werten nie eine Differenz kleiner als 2, wodurch etwaige Rundungsprobleme behoben werden.
Das obige ist der detaillierte Inhalt vonKönnen alle ganzzahligen Werte perfekt als Doubles dargestellt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!