2016-02-19 10 views
14

में संकलक को विभाजन को अनुकूलित करेगा Floating point division vs floating point multiplication इस प्रश्न के आधार पर। कुछ कारणों से प्रभाग गुणा से धीमा है।संकलक

क्या कंपाइलर आमतौर पर गुणा करके विभाजन को प्रतिस्थापित करेगा यदि यह संभव है?

उदाहरण के लिए:

float a; 
// During runtime a=5.4f 
float b = a/10.f; 

यह होगा:

float a; 
// During runtime a=5.4f 
float b = a*0.1f; 

यह एक संकलक भरोसेमंद प्रश्न माना जाता है, मैं VS2013 डिफ़ॉल्ट संकलक उपयोग कर रहा हूँ। हालांकि, यह अच्छा होगा अगर मुझे सामान्य जवाब (इस अनुकूलन की सैद्धांतिक वैधता)

+1

क्या संकलक को पारस्परिक रूप से गुणा करने में सक्षम होने के लिए विभाजन नहीं करना चाहिए? – NathanOliver

+2

यह "यदि संभव हो" के तहत शामिल नहीं है, तो यह एक ऐसा मामला है जहां तक ​​यह संभव नहीं है जब तक सटीकता का नुकसान स्वीकार नहीं किया जाता है। तो, उम्मीद है कि केवल एक ध्वज के साथ संकलन करते हैं जो विशेष रूप से इसे अनुमति देता है। – harold

+0

@NathanOliver समय संकलित करें .. –

उत्तर

15

नहीं, संकलक को सामान्य मामले के लिए ऐसा करने की अनुमति नहीं है: दो ऑपरेशन ऐसे परिणाम उत्पन्न कर सकते हैं जो थोड़ा समान नहीं हैं पारस्परिक की प्रतिनिधित्व त्रुटि के कारण।

आपके उदाहरण में, 0.1 में float के रूप में सटीक प्रतिनिधित्व नहीं है।

float f = 21736517; 
float a = f/10.f; 
float b = f * 0.1f; 
cout << (a == b) << endl; // Prints zero 

Demo.

नोट::njuffa के रूप में सही ढंग से नीचे टिप्पणी में लिखा है, ऐसी परिस्थितियाँ होती हैं, जब संकलक सकता है मेकअप इस 0.1 और 10 द्वारा प्रभाग द्वारा गुणा के परिणाम अलग करने के लिए कारण बनता है this paper में वर्णित संख्याओं के विस्तृत सेट के लिए कुछ अनुकूलन। उदाहरण के लिए, दो की शक्ति से गुणा या विभाजन आईईईई -754 float प्रतिनिधित्व के एक्सपोनेंट हिस्से के अतिरिक्त है।

+3

हालांकि कंपाइलर रूपांतरण करेगा यदि आप इसे बताते हैं कि आप परवाह नहीं है (जीसीसी का '-फस्ट-गणित', जो भी एमएसवीसी समकक्ष है)। –

+1

यह देखते हुए कि सी ++ फ्लोटिंग पॉइंट को कैसे परिभाषित करता है, मुझे लगता है कि आप गलत हैं। कंपाइलर * है * ऐसा करने की अनुमति है। हालांकि, उनमें से अधिकतर नहीं चुनते हैं (गति की कीमत पर अधिक सटीकता प्रदान करने के लिए पसंद करते हैं)। –

+3

किसी को ऐसे मामलों को अलग करना होगा जहां एक फ़्लोटिंग-पॉइंट डिवीजन आसानी से गुणा के साथ प्रतिस्थापित किया जा सकता है * बिट-समान परिणामों को बनाए रखने के दौरान *। आईईईई -754 अंकगणितीय के साथ प्लेटफॉर्म के लिए, यह लगातार divisors के लिए सच है जो 2 की शक्ति है, जब उलटा प्रतिनिधित्व योग्य है। मैंने देखा है कि कंपाइलर्स इस अनुकूलन को लागू करते हैं (उदाहरण के लिए 2.0 द्वारा विभाजन 0.5 के साथ गुणा हो जाता है)। [इस पेपर] में वर्णित अनुसार अन्य स्थिर divisors की एक विस्तृत श्रृंखला पर लागू एक तकनीक है (http://perso.ens-lyon.fr/nicolas.brisebarre/Publi/fpdivision.pdf)। अफसोस की बात है, मैंने किसी भी कंपाइलर का उपयोग नहीं देखा है। – njuffa

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