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.