iphone - samsung - impresoras compatibles con airprint
¿Cómo imprimir un doble con total precisión en iOS? (5)
Intenta esto, este trabajo para mi
NSLog (@ "% @", [NSString stringWithFormat: @ "% f", distancia]);
Caso de prueba:
NSLog(@"%f", M_PI);
NSLog(@"%@", [NSString stringWithFormat:@"%f", M_PI]);
NSLog(@"%@", [NSNumber numberWithDouble:M_PI]);
Resultados:
3.141593
3.141593
3.141592653589793
Conclusiones:
1) La impresión a través de NSLog () o [NSString stringWithFormat] proporciona una precisión muy baja ...
2) La impresión a través de [NSNumber numberWithDouble] proporciona una mejor precisión ...
Hubiera esperado obtener un resultado mucho más cercano al valor original: 3.14159265358979323846264338327950288 (como se define en math.h)
¿Alguna pista?
Las dos primeras líneas se redondean a 6 decimales porque esa es la longitud de redondeo predeterminada para printf
heredada de C.
La tercera línea muestra los datos con la máxima precisión útil: un número de punto flotante IEEE 754 64bit tiene un poco menos de 16 dígitos decimales de precisión, por lo que todos esos dígitos del literal en math.h
son inútiles (tal vez se pueden ver como prueba de futuro frente a una posible redefinición futura en un formato con más precisión).
Prueba esto:
NSLog(@"%.20f", M_PI);
Tal vez un poco tarde para responder, pero alguien podría encontrar estos problemas:
Debe usar doble largo con un formato máximo de 20 dígitos @ .20Lg . Los dobles largos son puntos flotantes de 80 bits, por lo que no obtendrás una mejor precisión que esa. Tenga en cuenta también que a partir de XCode 4.3.2 las constantes no están en doble notación larga, incluso si los muchos dígitos sugieren un doble súper largo ;-)
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
los resultados son:
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)
NSLog(@"%@", [NSDecimalNumber numberWithDouble:M_PI]);
un poco más de precisión