2013-06-21 8 views
5

Considera le rappresentazioni decimali del modulo d1.d2d3d4d5 ... dnExxx dove xxx è un esponente arbitrario e entrambi d1 e dn sono diversi da zero.Numero massimo di cifre decimali che possono influenzare un doppio

È il massimo n noto tale che esiste una rappresentazione decimale d1.d2d3d4d5 ... dnExxx tale che l'intervallo (d1.d2d3d4d5 ... dnExxx, d1.d2d3d4d5 ... ((dn) +1) Exxx) contiene un IEEE 754 doppio?

n deve essere almeno 17. La domanda è: quanto sopra 17.

Questo numero n ha qualcosa a che fare con il numero di cifre che è sufficiente prendere in considerazione in una conversione decimale a doppia tale come strtod(). Ho guardato il codice sorgente per David M. Gay's implementation sperando di trovare una risposta lì. C'è un'allusione a "40", ma non è chiaro se questa sia una conseguenza di un suono risultato matematico o solo di un limite statisticamente sicuro. Anche il commento sul "troncamento" fa sembrare che 0.5000000000000000000000000000000000000000000000000001 possa essere convertito in 0.5 in modalità round-upwards.

Musl's implementation sembra leggere circa 125 * 9 cifre, che è molto. Poi passa in modalità “appiccicoso”:

if (c!='0') x[KMAX-4] |= 1; 

Infine, come fa il cambiamento risposta quando sostituendo “contiene un IEEE 754 doppia” con “contiene il punto medio di due consecutivi IEEE 754 doppi”?

+1

Non sono sicuro di aver capito il punto. Ad esempio, '2^(- 1074)' ha 751 cifre decimali significative, quindi esiste una rappresentazione decimale 'd1.d2 ...d750E-324' soddisfacendo la condizione (è possibile ottenere più lunghi, ma non molto). Ma hai solo bisogno di una manciata di queste cifre per determinare il 'doppio 'IEEE754 più vicino. –

+1

@DanielFischer Ma 2^(- 1074) non si trova nell'intervallo esclusivo (d1.d2 ... d750E-324, d1.d2 ... (d750 + 1) E-324). A proposito (d750 + 1) è un leggero abuso di notazione se d750 è un "9". Questo abuso è anche nella mia domanda, ma l'alternativa (d1.d2 ... d750E-324, (d1.d2 ... d750E-324 + 1E-1074)) è anch'essa fonte di confusione. Potrei persino sbagliare l'esponente. –

+1

Ho usato una cifra inferiore a quella esatta, quindi è nell'intervallo aperto. –

risposta

6

Quando si dispone di un numero di sotto della norma con significando dispari, cioè un multiplo dispari di 2^(-1074), si dispone di un numero diverso da zero il cui ultima cifra nella rappresentazione decimale è il 1074 ° dopo il punto decimale. Hai quindi circa 300 zeri che seguono direttamente il punto decimale, quindi il numero ha circa 750-770 cifre decimali significative. Il più piccolo subnormale positivo, 2^(-1074) ha 751 cifre significative e il più grande subnormale positivo, (2^52-1)*2^(-1074) ha 767 cifre significative (penso che sia il massimo).

Quindi c'è almeno una sequenza d1, ..., d766 di cifre decimali tale che vi sia un IEEE754 double nell'intervallo aperto

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

La risposta non cambia molto se consideriamo "contiene il punto medio di due IEEE754 consecutivi double s ", poiché i subnormali double s hanno tutti all'incirca la stessa quantità di cifre decimali significative e anche il punto medio di due consecutivi.

Nel caso peggiore, l'intera sequenza di cifre deve essere consumato (non "0.5000000...0001" con un numero arbitrario di zeri prima della finale 1 che determina che il risultato sia 0.5 + 0.5^53 e non 0.5 quando arrotondamento per eccesso o verso l'alto).

Tuttavia, ci sono solo

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

cifre decimali significative necessarie per distinguere tra diverse double valori, in modo relativamente facile, anche se probabilmente non molto efficiente, metodo di analisi sarebbe quello di analizzare la prima (almeno 17) cifre (e l'esponente) al più vicino double e confrontare la stringa di input con la rappresentazione esatta di quel valore double (e il suo vicino).

+0

Grazie per la risposta. Il numero n che stavo cercando di determinare era il numero di cifre decimali che devono essere analizzate in modalità normale prima che sia sicuro passare alla modalità "appiccicosa". Le sequenze arbitrariamente lunghe e decimali come 0.50000 ... 00001 possono essere costruite, ma dopo un po 'importa solo se rimane una cifra diversa da zero o no, e la domanda a cui volevo rispondere era "dopo quante cifre, esattamente?". Devo ancora riflettere sulla differenza tra le modalità dirette e quelle più vicine, ma mi hai aiutato molto. –

+1

Non credo di aver acquistato la tua tesi secondo cui sono sufficienti 17 cifre. Guarda 1 + 45/2^53 e 1 + 46/2^53. '1.000000000000000050' arrotonda, ma' 1.00000000000000005059' arrotonda. La differenza è nel 18 ° decimale. – tmyklebu

+1

@tmyklebu Non esiste 'double' IEEE754 con il valore' 1 + 45/2^53'. Ciò richiede 54 bit di precisione da rappresentare. Il prossimo più piccolo dopo '1 + 46/2^53' è' 1 + 44/2^53 = 1.000000000000004884981308350688777863979339599609375'. –