Возможно, с ответом немного поздно, но кто-то может наткнуться на эти проблемы:
Вы должны использовать long double с максимальным форматированием 20 цифр @. 20Lg .
Длинные двойные числа - это 80-битные числа с плавающей запятой, поэтому вы не получите большей точности, чем эта.
Также имейте в виду, что начиная с XCode 4.3.2 константы не имеют длинных двойных обозначений, даже если многие цифры указывают на сверхдлинный двойной; -)
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
результаты:
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)