non dovreste' t converti continuamente tra doppi e archi, dato che tende a perdere precisione (in generale, devi essere molto prudente se non vuoi perdere precisione).
Ad esempio, nextafter(1.0,2.0)
restituisce il doppio più piccolo maggiore di 1 (esattamente 1.0000000000000002220446049250313080847263336181640625, ma siamo contenti di 1.0000000000000002). La formattazione con "% g" restituisce semplicemente "1".
Ci aspetteremmo NSNumber a fare la cosa giusta, ma [[NSNumber numberWithDouble:nextafter(1,2)] stringValue]
restituisce anche "1". Secondo i documenti, -[NSNumber stringValue]
chiama [self descriptionWithLocale:nil]
che lo formatta con "% 0.16g". Questo non è abbastanza. Tuttavia, otteniamo la risposta corretta formattando con "% .17g". Penso che "% .17g" sia sufficiente purché i doppi siano IEEE 754 a 64 bit e le librerie funzionino correttamente, ma non c'è garanzia.
Alla fine della giornata, non è possibile garantire che [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n
.
fonte
2010-07-21 13:09:04
Thankyou Guys! Ha funzionato ! –
Ora che è completamente soggettivo –
mi sono guardato intorno e finora% f e% g sembrano essere identici secondo la maggior parte dei riferimenti. Come sono differenti? – jamone