web-dev-qa-db-fra.com

Comment imprimer un double avec une précision totale sur iOS?

Cas de test:

NSLog(@"%f", M_PI);
NSLog(@"%@", [NSString stringWithFormat:@"%f", M_PI]);
NSLog(@"%@", [NSNumber numberWithDouble:M_PI]);

Résultats:

3.141593
3.141593
3.141592653589793

Conclusions:

1) L’impression via NSLog () ou [NSString stringWithFormat] fournit une précision très faible ...

2) L’impression via [NSNumber numberWithDouble] offre une meilleure précision ...

Je m'attendais à obtenir un résultat beaucoup plus proche de la valeur d'origine: 3.14159265358979323846264338327950288 (tel que défini dans math.h)

Des indices?

28
Ariel Malka

Les deux premières lignes arrondies à 6 décimales, car il s'agit de la longueur d'arrondi par défaut pour printf héritée de C.

La troisième ligne affiche les données avec la précision utile maximale - un nombre à virgule flottante IEEE 754 64 bits a un peu moins de 16 chiffres décimaux de précision, de sorte que tous les chiffres du littéral dans math.h sont inutiles (ils peuvent peut-être être vus comme futurs). contre une éventuelle redéfinition future dans un format plus précis).

22
Michael Borgwardt

Essaye ça:

NSLog(@"%.20f", M_PI);
10
Claus Broch

Peut-être un peu tard pour répondre, mais quelqu'un pourrait tomber sur ces problèmes:

Vous devez utiliser un double long avec un formatage maximal de 20 chiffres @ .20Lg . Les doubles longs sont des points flottants de 80 bits, vous n'aurez donc pas une meilleure précision que celle-là .. qu'à partir de XCode 4.3.2, les constantes ne sont pas en double notation longue, même si les nombreux chiffres suggèrent un double super-long ;-)

NSLog(@"%.21g", M_PI);

// with cast because M_PI is not defined as long double
NSLog(@"%.21Lg", (long double)M_PI);

// with corrected long double representation (#.####L):
//                                   v from here on overhead 
NSLog(@"%.21Lg", 3.14159265358979323846264338327950288L);

// alternative for creating PI
NSLog(@"%.21Lg", asinl(1.0)*2.0);
// and a funny test case:
NSLog(@"%.21Lg", asinl(1.0)*2.0 - M_PI); // on second thought, not that funny: should be 0.0

les résultats sont:

p[5528:f803] 3.141592653589793116   (actually 16 digits standard double precision)
p[5528:f803] 3.141592653589793116
p[5528:f803] 3.14159265358979323851
p[5528:f803] 3.14159265358979323851
p[5575:f803] 1.22514845490862001043e-16 (should have been 0.0)
10

Essayez ceci, ce travail pour moi

NSLog (@ "% @", [NSString stringWithFormat: @ "% f", distance]);

0
Urvish Modi