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”?
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. –
@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. –
Ho usato una cifra inferiore a quella esatta, quindi è nell'intervallo aperto. –