2011-04-20 14 views
26

टेस्ट मामला:आईओएस पर पूर्ण परिशुद्धता के साथ डबल प्रिंट कैसे करें?

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

परिणाम:

3,141593
3,141593
3,141592653589793

निष्कर्ष:

1)) NSLog (के माध्यम से मुद्रण या [NSString stringWithFormat ] एक बहुत कम परिशुद्धता प्रदान करते हैं ...

के माध्यम से 2) मुद्रण [NSNumber numberWithDouble] एक बेहतर परिशुद्धता प्रदान करता है ...

मैं एक परिणाम बहुत मूल मूल्य के साथ नज़दीकी बढ़ाने की उम्मीद है |: 3.14159265358979323846264338327950288 (के रूप में परिभाषित गणित में।

कोई संकेत?

उत्तर

21

पहले दो लाइनों क्योंकि उस printf के लिए डिफ़ॉल्ट राउंडिंग लंबाई सी

से विरासत में मिली है तीसरी पंक्ति अधिकतम उपयोगी परिशुद्धता वाले डेटा को प्रदर्शित करती है - एक आईईईई 754 64 बिट फ्लोटिंग-पॉइंट नंबर परिशुद्धता के 16 दशमलव अंकों से थोड़ा कम है, इसलिए math.h में शाब्दिक के उन सभी बिंदु व्यर्थ हैं (शायद उन्हें अधिक सटीकता वाले प्रारूप में संभावित भविष्य के पुनर्वितरण के विरुद्ध भावी-प्रमाणन के रूप में देखा जा सकता है)।

+0

शानदार, धन्यवाद! –

10

इस प्रयास करें:

NSLog(@"%.20f", M_PI); 
+1

धन्यवाद, लेकिन यह मदद नहीं कर रहा है। नतीजा 3.14159265358979311600 है, जो बुरी तरह गोल है (5 अंतिम आंकड़े गलत हैं) –

+1

@ एरियल: ऐसा इसलिए है क्योंकि वे 52 बाइनरी अंकों के वास्तविक मूल्य को गोल करने और फिर परिणाम को दशमलव में परिवर्तित करने का परिणाम हैं। –

-1
NSLog(@"%@", [NSDecimalNumber numberWithDouble:M_PI]); 

थोड़ा और अधिक सटीक दौर 6 दशमलव के

+0

धन्यवाद, लेकिन यह मदद नहीं कर रहा है। परिणाम 3.141592653589793792 है, जो बुरी तरह गोल है (3 अंतिम आंकड़े गलत लगते हैं) –

10

हो सकता है कि थोड़ी देर हो चुकी एक जवाब है, लेकिन किसी के रूप में इन समस्याओं पर आते हैं हो सकता है:

आप 20 अंकों @ .20Lg की एक अधिकतम स्वरूपण के साथ लंबे समय तक डबल का उपयोग करना चाहिए। लंबे युगल 80-बिट फ़्लोटिंग पॉइंट हैं, इसलिए आपको इससे बेहतर परिशुद्धता नहीं मिलेगी। यह भी ध्यान रखें कि XCode के रूप में 4.3.2 स्थिरांक लंबे डबल अंकन में नहीं हैं, भले ही कई अंक का सुझाव एक uberlong डबल ;-)

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) 
संबंधित मुद्दे