2009-03-09 25 views
7

मैं निम्नलिखित कोड का टुकड़ा है:सी में ईपीएस का क्या अर्थ है?

if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS) return(FALSE); 

कौन सा मैं सी # में बदलने की कोशिश कर रहा हूँ। "ईपीएस" का क्या अर्थ है?

इस कोड http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/

+0

मैं वर्ग जड़ों के साथ एक समस्या को हल करने के लिए संघर्ष कर रही हैं और मुझे ईपीएस का उपयोग करने की जरूरत है। लेकिन मुझे मैक्रो नहीं मिल रहा है। मैं currenty विंडोज 7 x64 के तहत cygwin उपयोग कर रहा हूँ, जीसीसी और जी के साथ ++ संकलन। मुझे अपनी परियोजना में क्या lib शामिल करना चाहिए? – Spidey

उत्तर

20

से यह निर्धारित करने के लिए संख्या "काफी छोटे नगण्य होने के लिए" है epsilon के कुछ फार्म होने जा रहा है। सटीक मान इस मामले में कहीं भी #define डी होने जैसा दिखता है।

1

एप्सिलॉन ... यह शायद एक #define हो जाएगा ...

एप्सिलॉन आम तौर पर एक नंबर नाव या डबल सटीकता की सीमा के भीतर शून्य करने के लिए बहुत करीब निरूपित किया जाता है।

इसका उपयोग यह निर्धारित करने के लिए किया जाता है कि p43.x का मान शून्य के बराबर शून्य के रूप में गिना जाता है या नहीं।

+3

बाह ... गॉट Skeeted सेकंड के एक जोड़े द्वारा। –

+0

और ... यह कोड नमूने में नहीं है। –

1

मैं कहेंगे कि ईपीएस एप्सिलॉन के लिए है:

गणित (विशेष रूप से पथरी) में, एक मनमाने ढंग से (या लगभग इतनी) छोटे सकारात्मक मात्रा।

आप उदाहरण में यह निर्धारित करने के लिए (ABS (p43.x) का परिणाम काफी छोटा (शून्य के करीब है) किया जाता है।

8

ईपीएस है एप्सिलॉन। "बंद पर्याप्त" कारक।

सवाल "निरपेक्ष मूल्य काफी करीब है?" कहाँ "पर्याप्त बंद" कुछ छोटी संख्या, अक्सर 1.0E-3 की तरह कुछ है।

कैसे एल्गोरिथ्म जवाब से जोड़ के आधार पर है, प्रदर्शन पर निर्भर हो सकता ईपीएस का आकार। ईपीएस को बहुत छोटा बनाने से सावधान रहें, क्योंकि आपकी प्रक्रिया हो सकती है घंटों (या सदियों) के लिए दौड़ें और वास्तव में उपयोग करने योग्य उत्तर न दें।

इस मामले में - जहां कोई लूप नहीं है - ईपीएस का उपयोग किया जाता है क्योंकि फ़्लोटिंग पॉइंट संख्या गुणा के दौरान छोटी त्रुटियों को जमा करती है। आप बस

a == b 

और यह सामान्य रूप से सच नहीं हो सकता है। तो बजाय हम हमेशा कहते हैं

abs(a-b) <= EPS 
1

सबसे अधिक संभावना, p43 एक struct जो चल बिन्दु मान रखती है। चूंकि फ़्लोटिंग पॉइंट मानों में एक सीमित परिशुद्धता होती है, वे केवल वास्तविक संख्याओं के उप-समूह का प्रतिनिधित्व कर सकते हैं, जिसका अर्थ है कि गोलियों की त्रुटियों के लिए मार्जिन के साथ समानता की जांच करना अक्सर आवश्यक होता है।

इसके बजाय x = 0 जाँच की

, कोड की जाँच करता है |x| < EPS, यानी ]-EPS, +EPS[ में सभी मान काफी छोटा 0 माना जाता है।

आप machine epsilon पर भी पढ़ने पर विचार कर सकते हैं।

2

मैं कहूंगा कि जॉन स्कीट सही है।

(setq nearzero 0.00001) 
इस मैं कहूंगा कि ईपीएस 0.00001 के लिए एक निरंतर सेट है से

तो: उस पृष्ठ पर तुतलाना कोड को देख कर आप गणना 'nearzero' कहा जाता है जो इस तरह के रूप में परिभाषित किया गया है में एक समान संदर्भ मिल जाएगा।

1

सी और सी ++ में आपके पास प्रीप्रोसेसर स्थिरांक FLT_EPSILON और DBL_EPSILON है जो क्रमशः फ्लोट और डबल परिशुद्धता के लिए 1 + {FLT, DBL} _EPSILON> 1 जैसी छोटी संख्याएं हैं। यह ईपीएस कुछ समान अनुप्रयोग विशिष्ट "शून्य के करीब" मान प्रतीत होता है।

+1

C99 के अनुसार नहीं: मशीन एप्सिलॉन है "1 के बीच का अंतर और कम से कम 1 से अधिक मूल्य कि दिया फ्लोटिंग पॉइंट प्रकार में प्रदर्शनीय है"; यह मान राउंडिंग मोड से स्वतंत्र है (आपका नहीं है); जब भी गोल करने के लिए, आप ~ 2 के एक कारक से गलत हो जाएगा – Christoph

संबंधित मुद्दे