Nathan Sims
2011-06-03 16:28:54 UTC
It would seem the only way I can display 8 significant digits after the decimal place using floats, doubles, or long doubles is to get the stringValue of an NSNumber (OSX 10.6.7, Xcode 3.2.6). I know internally the full precision is being used, but it appears there's no difference whatever between format specifiers %f, %lf, and %Lf. Or am I somehow using these incorrectly?
#import <Foundation/Foundation.h>
int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
float ftest = -175.12345678;
double dtest = -175.12345678;
long double ldtest = -175.12345678;
char fteststr[32], dteststr[32], ldteststr[32];
// try converting using C functions
sprintf(fteststr,"%f",ftest);
sprintf(dteststr,"%lf",dtest);
sprintf(ldteststr,"%Lf",ldtest);
NSLog(@"C values: Float: %f Double: %lf Long Double: %Lf",ftest,dtest,ldtest);
NSLog(@"C strings: Float: %s Double: %s Long Double: %s",fteststr,dteststr,ldteststr);
// try converting using NSNumbers
float f2test;
double d2test;
NSNumber *fNumb = [NSNumber numberWithFloat:ftest];
NSNumber *dNumb = [NSNumber numberWithDouble:dtest];
f2test = [fNumb floatValue];
d2test = [dNumb doubleValue];
NSString *sStr = [dNumb stringValue];
NSLog(@"NSNumber: Float: %f Double: %lf String: %@",ftest,dtest,sStr);
// try converting using NSStrings
NSString *fStr = [NSString stringWithFormat:@"%f",ftest];
NSString *dStr = [NSString stringWithFormat:@"%lf",dtest];
NSString *ldStr = [NSString stringWithFormat:@"%Lf",ldtest];
NSLog(@"NSString: Float: %@ Double: %@ String: %@",fStr,dStr,ldStr);
[pool drain];
return 0;
}
run
C values: Float: -175.123459 Double: -175.123457 Long Double: -175.123457
C strings: Float: -175.123459 Double: -175.123457 Long Double: -175.123457
NSNumber: Float: -175.123459 Double: -175.123457 String: -175.12345678 <--- the only correct result
NSString: Float: -175.123459 Double: -175.123457 String: -175.123457
#import <Foundation/Foundation.h>
int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
float ftest = -175.12345678;
double dtest = -175.12345678;
long double ldtest = -175.12345678;
char fteststr[32], dteststr[32], ldteststr[32];
// try converting using C functions
sprintf(fteststr,"%f",ftest);
sprintf(dteststr,"%lf",dtest);
sprintf(ldteststr,"%Lf",ldtest);
NSLog(@"C values: Float: %f Double: %lf Long Double: %Lf",ftest,dtest,ldtest);
NSLog(@"C strings: Float: %s Double: %s Long Double: %s",fteststr,dteststr,ldteststr);
// try converting using NSNumbers
float f2test;
double d2test;
NSNumber *fNumb = [NSNumber numberWithFloat:ftest];
NSNumber *dNumb = [NSNumber numberWithDouble:dtest];
f2test = [fNumb floatValue];
d2test = [dNumb doubleValue];
NSString *sStr = [dNumb stringValue];
NSLog(@"NSNumber: Float: %f Double: %lf String: %@",ftest,dtest,sStr);
// try converting using NSStrings
NSString *fStr = [NSString stringWithFormat:@"%f",ftest];
NSString *dStr = [NSString stringWithFormat:@"%lf",dtest];
NSString *ldStr = [NSString stringWithFormat:@"%Lf",ldtest];
NSLog(@"NSString: Float: %@ Double: %@ String: %@",fStr,dStr,ldStr);
[pool drain];
return 0;
}
run
C values: Float: -175.123459 Double: -175.123457 Long Double: -175.123457
C strings: Float: -175.123459 Double: -175.123457 Long Double: -175.123457
NSNumber: Float: -175.123459 Double: -175.123457 String: -175.12345678 <--- the only correct result
NSString: Float: -175.123459 Double: -175.123457 String: -175.123457