2013-06-21 6 views
5

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“?

+1

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. –

+1

@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. –

+1

Ich benutzte eine Ziffer weniger als die genaue Darstellung hat, also liegt es im offenen Intervall. –

Antwort

6

Wenn Sie eine subnormale Zahl mit ungeraden Signifikanden haben, das heißt, ein ungerades Vielfaches von 2^(-1074), haben Sie eine Zahl, deren letzte Ziffer ungleich Null in der Dezimaldarstellung ist die 1.074 th nach dem Komma. Sie haben dann etwa 300 Nullen direkt hinter dem Dezimalpunkt, so dass die Zahl etwa 750-770 signifikante Dezimalziffern hat. Der kleinste positive Unternormale, 2^(-1074), hat 751 signifikante Ziffern, und der größte positive Unternormale, (2^52-1)*2^(-1074), hat 767 signifikante Ziffern (ich denke, das ist das Maximum).

So gibt mindestens eine Sequenz d1, ..., d766 der Dezimalstellen so ist, dass es ein IEEE754 ist double im offenen Intervall

(d1.d2...d766E-308, d1.d2...(d766 + 1)E-308) 

Die Antwort ändert sich nicht viel, wenn wir „enthält den Mittelpunkt von zwei aufeinanderfolgenden IEEE754 betrachten double s ", da subnormal double s alle ungefähr die gleiche Menge an signifikanten Dezimalziffern haben, und der Mittelpunkt von zwei aufeinander folgenden auch.

Im schlimmsten Fall wird die gesamte Ziffernfolge muss (man denkt "0.5000000...0001" mit beliebig vielen Nullen vor den letzten 1, der bestimmt, dass das Ergebnis 0.5 + 0.5^53 ist und nicht 0.5 wenn weg von Null Rundung oder oben) verbraucht werden.

Allerdings gibt es nur

floor(DBL_MANT_DIG * log 2/log 10) + 2 = 17 

signifikanten Dezimalstellen notwendig, zwischen verschiedenen double Werten zu unterscheiden, so dass eine relativ einfache, wenn auch wahrscheinlich nicht sehr effizient, die Methode der Analyse des ersten zu analysieren wäre (zumindest 17) Ziffern (und der Exponent) zum nächsten double, und vergleichen Sie die Eingabezeichenfolge mit der genauen Darstellung dieses double Wertes (und seines Nachbarn).

+0

Danke für Ihre Antwort. Die Zahl n, die ich ermitteln wollte, war die Anzahl der Dezimalziffern, die im normalen Modus geparst werden müssen, bevor es sicher ist, in den "sticky" -Modus zu wechseln. Beliebig lange Dezimalfolgen wie 0.50000 ... 00001 können aufgebaut werden, aber nach einer Weile ist es nur noch wichtig, ob eine Ziffer ungleich Null bleibt und die Frage, die ich beantworten wollte, war "nach wie vielen Ziffern genau?". Ich muss immer noch über den Unterschied zwischen gerichteten und nächsten Modi nachdenken, aber Sie haben mir sehr geholfen. –

+1

Ich glaube nicht, ich kaufe dein Argument, dass 17 Ziffern genug sind. Schauen Sie sich 1 + 45/2^53 und 1 + 46/2^53 an. '1.00000000000000505' wird abgerundet, aber' 1.00000000000000005059' wird abgerundet. Der Unterschied liegt in der 18. Dezimalstelle. – tmyklebu

+1

@tmyklebu Es gibt kein IEEE754 'double' mit dem Wert' 1 + 45/2^53'. Das erfordert 54 Bits Genauigkeit, um dargestellt zu werden. Der nächstkleinere nach '1 + 46/2^53' ist '1 + 44/2^53 = 1,000000000000004884981308350688777863979339599609375'. –

Verwandte Themen