2011-10-08 12 views
11

टीएलडीआर: मैं मानक फ़्लोटिंग पॉइंट कोड को इस तरह से कैसे कॉल करूं जो चेतावनी के बिना 32 और 64 बिट CGFloats दोनों को संकलित करता है?CGFloat: गोल, मंजिल, पेट, और 32/64 बिट परिशुद्धता


कंप्रेसर सेटिंग्स और प्लेटफ़ॉर्म के आधार पर CGFloat को या तो डबल या फ्लोट के रूप में परिभाषित किया गया है। मैं कोड लिखने की कोशिश कर रहा हूं जो कई परिस्थितियों में अच्छी तरह से काम करता है, बिना कई चेतावनियां उत्पन्न किए।

जब मैं फर्श, पेट, छत, और अन्य साधारण फ़्लोटिंग प्वाइंट ऑपरेशंस जैसे फ़ंक्शंस का उपयोग करता हूं, तो मुझे मूल्यों को छोटा करने के बारे में चेतावनियां मिलती हैं।

चेतावनी: उदाहरण के लिए अंतर्निहित रूपांतरण को छोटा एक 32-बिट मूल्य

मैं के रूप में मुझे पता है, शुद्धता या गणना की में परिशुद्धता के नुकसान के बारे में चिंतित नहीं हूँ में 64-बिट मूल्य है कि मैं बस सभी कार्यों के डबल परिशुद्धता संस्करणों का उपयोग कर सकते हैं (फर्श के बजाय मंजिल, आदि); हालांकि, मुझे इन त्रुटियों को सहन करना होगा।

क्या कोड को साफ करने का कोई तरीका है जो 32 बिट और 64 बिट फ्लोट दोनों का समर्थन करता है या तो #ifdef __ LP64 __ के उपयोग किए बिना, या सभी मानक फ़्लोटिंग पॉइंट फ़ंक्शंस के लिए रैपर फ़ंक्शन लिखने के बिना?

उत्तर

19

आप उन कार्यों का उपयोग tgmath.h से कर सकते हैं।

#include <tgmath.h> 

... 

double d = 1.5; 
double e = floor(d); // will choose the 64-bit version of 'floor' 

float f = 1.5f; 
float g = floor(f); // will choose the 32-bit version of 'floorf'. 
+1

, मैं इस सवाल पाया: http://stackoverflow.com/questions/ 5352457/cgfloat-based-math-functions – leecbaker

+1

ध्यान दें कि Xcode 6.1 में, tgmath सहित मॉड्यूल सक्षम होने पर सहायता नहीं करता है। Http://stackoverflow.com/q/23333287/449161 देखें –

3

आप केवल कुछ कार्यों की जरूरत है तो आप इसके बजाए उपयोग कर सकते हैं: अब मैं के लिए खोज करने के लिए क्या पता है कि

#if CGFLOAT_IS_DOUBLE 
#define roundCGFloat(x) round(x) 
#define floorCGFloat(x) floor(x) 
#define ceilCGFloat(x) ceil(x) 
#else 
#define roundCGFloat(x) roundf(x) 
#define floorCGFloat(x) floorf(x) 
#define ceilCGFloat(x) ceilf(x) 
#endif 
संबंधित मुद्दे