Die Grenzen der Doppel Variable in C ++

Fließkommavariablen in C ++ kommen mit ihren eigenen Grenzen. Sie können die Dinge nicht verwendet werden, zu zählen, nehmen sie mehr zu verarbeiten, sie mehr Speicher verbrauchen, und sie leiden auch von Rundungsfehler (wenn auch nicht annähernd so schlimm wie int

). Nun jedes dieser Probleme nacheinander zu prüfen.

Zählen mit Doppel

Sie können einen Gleitkomma-Variable in einer Anwendung zu verwenden, wo das Zählen von Bedeutung ist. In C ++ können Sie nicht sagen, dass es 7,0 Zeichen in meinem Vornamen sind. Die Betreiber beim Zählen beteiligt funktionieren nicht auf Gleitkomma-Variablen. Insbesondere die Auto-Inkrement (++) und Auto-Dekrement (- -) Operatoren sind streng verboten auf doppelt.

Rechengeschwindigkeit der Doppel

Computer können schneller Integer-Arithmetik durchführen, als sie es tun können Gleitkomma-Arithmetik. Glücklicherweise haben die Floating-Point-Prozessoren bereits seit vielen Jahren in CPUs gebaut, so dass der Unterschied in der Leistung ist nicht annähernd so wichtig wie es einmal war. Die folgende Schleife wurde nur als ein einfaches Beispiel geschrieben, erste Integer-Arithmetik mit:

int nValue1 = 1, nValue2 = 2, nValue3 = 2-for (int i = 0-i lt; 1000000000- i ++) {int nAverage = (nValue1 + nValue2 + nValue3) / 3-}

Diese Schleife dauert ca. 5 Sekunden auszuführen. Führen Sie die gleiche Schleife in Gleitkomma-Arithmetik:

Doppel dValue1 = 1, dValue2 = 2, dValue3 = 2-for (int i = 0-i lt; 1000000000- i ++) {double DBMITTELWERT = (dValue1 + dValue2 + dValue3) / 3,0-}

Dieser Blick dauerte etwa 21 Sekunden auszuführen. im Durchschnitt 1 Milliarde mal in etwas mehr als 20 Sekunden zu berechnen ist nicht schäbig, aber es ist immer noch viermal langsamer als die Verarbeitungszeit für die ganze Zahl äquivalent.

Die doppelte variable verbraucht mehr Speicher

Auf einem PC oder Macintosh, ein int 4 Bytes verbraucht, während ein doppelt dauert 8 Byte. Das klingt nicht nach viel - und in der Tat ist es nicht - aber wenn man ein paar Millionen von diesen Dingen hatte in Erinnerung zu halten. . . na ja, es wäre noch nicht viel sein. Aber wenn Sie hatte ein paar hundert Millionen, dann wäre der Unterschied beträchtlich sein.

Dies ist eine andere Art zu sagen, dass, wenn Sie eine verdammt viel von Objekten zu speichern müssen, keine Sorge über den Unterschied im Speicher durch eine Art Vergleich zu einem anderen genommen. Stattdessen wählen Sie den Variablentyp, der Ihren Bedürfnissen entspricht.

Wenn Sie nur eine Anwendung passieren zu programmieren, die auf die Bedürfnisse (sagen wir) gleichzeitig das Alter eines jeden Menschen auf dem Planeten zu manipulieren, dann können Sie in Richtung der kleineren lehnen wollen int weil es verbraucht weniger Speicher. (Tun Sie so etwas oft?)

Der Verlust der Genauigkeit mit Doppel

Eine doppelte Variable hat etwa 16 signifikanten Stellen an Genauigkeit. Bedenken Sie, dass ein Mathematiker würde die Zahl 1/3 als 0.333 auszudrücken. . ewig so weitergehen., wo die Ellipsen, dass die zu dritt an. Das Konzept einer unendlichen Reihe macht Sinn, in der Mathematik, aber nicht in der Computerbranche.

Ein Computer hat nur eine begrenzte Menge an Speicher und eine finite Menge an Genauigkeit. Deshalb hat es abzurunden, was in einem winzigen Ergebnisse (aber real) Fehler.

C ++ kann in vielen Fällen für Rundungsfehler zu korrigieren. Zum Beispiel am Ausgang, wenn eine Variable ist ,99999999999999, wird C ++ einfach davon ausgehen, dass es wirklich 1,0 ist und entsprechend anzuzeigen. Jedoch C ++ kann für alle Gleitkommazahlen Rundungsfehler nicht korrekt ist, so müssen Sie vorsichtig sein. Zum Beispiel können Sie nicht sicher sein, dass 1/3 + 1/3 + 1/3 bis 1,0 gleich ist:

Doppel d1 = 23,0-double d2 = d1 / 7,0-if (d1 == (d2 * 7.0)) {cout lt; lt; "Haben wir hier?" lt; lt; endl-}

Man könnte denken, dass dieser Code-Schnipsel würde die immer angezeigt werden "Haben wir hier?" string, aber überraschend ist es nicht. Das Problem ist, dass 23 geteilt durch 7 nicht exakt in einer Reihe Gleitkommazahlen ausgedrückt werden. Etwas verloren. So d2 * 7 sehr nahe zu 23, ist aber nicht genau gleich.

Anstatt zwischen zwei Gleitkommazahlen für die exakte Gleichheit suchen, sollten Sie fragen werden, # 147-D2 * 7 verschwindend nah an Wert d1 # 148- Sie können das tun, wie folgt?:

Doppel d1 = 23,0-double d2 = d1 / 7.0 - // Ist d2 * 7.0 innerhalb Delta von d1 doppelte Differenz = (d2 * 7,0) - d1-double delta = 0,00001-if (Differenz lt; Delta Differenz> -delta) {cout lt; lt; "Haben wir hier?" lt; lt; endl-}

Dieser Codeausschnitt berechnet die Differenz zwischen d1 und d2 * 7.0. Ist diese Differenz kleiner als ein kleines Delta ist, ruft der Code es einen Tag und sagt, dass d1 und d2 * 7 im wesentlichen gleich sind.

Nicht-so-begrenzte Anzahl von Doppel

Die größte Zahl, die ein Doppel speichern kann etwa 10 bis 38. Macht. Das ist eine 1 mit 38 Nullen nach it-, dass die mickrigen 2 Milliarden maximale Größe für ein int zum Frühstück isst. Das ist sogar mehr als die Staatsschuld (zumindest zum Zeitpunkt des Schreibens dieses Artikels). Es gibt wahrscheinlich Anwendungen, bei denen 38 Nullen nicht ausreichen.

Denken Sie daran, dass nur die ersten 16 Stellen von Bedeutung sind. Die restlichen 22 Stellen sind Lärm, mit erlag bereits Standard Gleitkommazahlen Rundungsfehler.

Menü