13 Stimmen

Dezimalpräzision von Schwimmern

Äquivalent zu log10(2^24) 7,225 Dezimalstellen

Wikipedia

Genauigkeit: 7 Ziffern

MSDN

6

std::numeric_limits<float>::digits10

Warum gibt numeric_limits hier 6 zurück? Sowohl Wikipedia als auch MSDN berichten, dass Floats eine Genauigkeit von 7 Dezimalstellen haben.

19voto

Stephen Canon Punkte 100340

Im Zweifelsfall lesen Sie die Spezifikation. Der C++ Standard besagt, dass digits10 ist:

Anzahl der Ziffern zur Basis 10, die ohne Veränderung dargestellt werden können.

Das ist ein wenig vage; zum Glück gibt es eine Fußnote:

Äquivalent zu FLT_DIG, DBL_DIG, LDBL_DIG

Diese sind in der C-Norm definiert; lassen Sie uns dort nachschlagen:

Anzahl der Dezimalstellen, q, so dass jede Fließkommazahl mit q Dezimalstellen in eine Fließkommazahl mit p Ziffern der Radix b und wieder zurück gerundet werden kann, ohne dass sich die q Dezimalstellen ändern.

Also std::numeric_limits<float>::digits10 ist die Anzahl der Dezimalstellen, so dass jede Fließkommazahl mit so vielen Stellen unverändert bleibt, wenn man sie in eine float und zurück zu dezimal.

Wie Sie sagen, haben Gleitkommazahlen eine Genauigkeit von etwa 7 Stellen nach dem Komma, aber der Fehler bei der Darstellung sowohl von Dezimalzahlen mit fester Breite als auch von Gleitkommazahlen ist nicht gleichmäßig logarithmisch. Der relative Fehler beim Runden einer Zahl der Form 1.xxx auf eine feste Anzahl von Dezimalstellen beträgt fast zehnmal größer als der relative Fehler beim Runden von 9,xxx auf dieselbe Anzahl von Dezimalstellen. Je nachdem, wo ein Wert in einer Binade liegt, kann der relative Fehler beim Runden auf 24 Binärziffern um einen Faktor von fast zwei variieren.

Dies hat zur Folge, dass nicht alle siebenstelligen Dezimalzahlen die Hin- und Rückreise zum Float überleben, wohl aber alle sechsstelligen Dezimalzahlen. Daraus folgt, std::numeric_limits<float>::digits10 ist 6.

Es gibt nicht so viele sechs- und siebenstellige Dezimalzahlen mit Exponenten in einem gültigen Bereich für die float Sie können ganz einfach ein Programm schreiben, um sie alle ausführlich zu testen, wenn Sie noch nicht überzeugt sind.

2voto

Paul R Punkte 201623

Die Mantisse besteht eigentlich nur aus 23 Bits (es gibt eine implizite 1, also sind es effektiv 24 Bits, aber die 1 variiert natürlich nicht). Dies ergibt eine Genauigkeit von 6,923689900271567 Dezimalstellen, was nicht ganz 7 ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X