Betrachten Sie Dezimaldarstellungen der Form d1.d2d3d4d5 ... dnExxx wobei xxx ein beliebiger Exponent ist und beide d1 und dn ungleich Null sind.Maximale Anzahl von Dezimalstellen, die sich auf ein Doppel auswirken können
Ist das Maximum n so bekannt, dass es eine dezimale Darstellung d1.d2d3d4d5 ... dnExxx gibt, so dass das Intervall (d1.d2d3d4d5 ... dnExxx, d1.d2d3d4d5 ... ((dn) +1) Exxx) enthält ein IEEE 754 Double?
n sollte mindestens 17. Die Frage ist, wie weit über 17.
Diese Zahl n hat etwas mit der Anzahl der Stellen zu tun, dass es genug ist, in einem Dezimal-Doppelwandler zu berücksichtigen solche als strtod()
. Ich schaute auf den Quellcode für David M. Gay's implementation in der Hoffnung, dort eine Antwort zu finden. Es gibt eine Anspielung auf "40", aber es ist unklar, ob dies eine Konsequenz eines guten mathematischen Ergebnisses oder nur eine statistisch sichere Grenze ist. Auch der Kommentar über "Abschneiden" klingt wie 0,500000000000000000000000000000000000000000000000000001 kann in Runde-aufwärts-Modus auf 0,5 umgewandelt werden.
Musl's implementation scheint etwa 125 * 9 Ziffern zu lesen, die eine Menge ist. Dann schaltet er auf „sticky“ Modus:
if (c!='0') x[KMAX-4] |= 1;
Und schließlich, wie sich die Antwort ändern, wenn Substitution „enthält eine IEEE 754 double“ mit „enthält den Mittelpunkt von zwei aufeinander folgenden IEEE 754 doubles“?
Ich bin mir nicht sicher, ob ich den Punkt verstehe. Zum Beispiel hat '2^(- 1074)' 751 signifikante Dezimalziffern, daher gibt es eine dezimale Darstellung 'd1.d2 ...d750E-324' erfüllt die Bedingung (Sie können längere, aber nicht viel bekommen). Aber Sie brauchen nur eine Handvoll dieser Ziffern, um den nächsten IEEE754 'double' zu bestimmen. –
@DanielFischer Aber 2^(- 1074) ist nicht im exklusiven Intervall (d1.d2 ... d750E-324, d1.d2 ... (d750 + 1) E-324). Übrigens (d750 + 1) ist ein leichter Missbrauch der Notation, wenn d750 eine "9" ist. Dieser Missbrauch ist auch in meiner Frage, aber die Alternative (d1.d2 ... d750E-324, (d1.d2 ... d750E-324 + 1E-1074)) ist auch verwirrend. Ich könnte sogar den Exponenten falsch bekommen. –
Ich benutzte eine Ziffer weniger als die genaue Darstellung hat, also liegt es im offenen Intervall. –