2012-12-17 30 views
19

अलावा गणितीय साहचर्य संपत्ति रखती है:सी सहयोगी में फ्लोटिंग पॉइंट ऑपरेशंस हैं?

(a + b) + c = a + (b + c) 

सामान्य स्थिति में, इस संपत्ति फ्लोटिंग प्वाइंट संख्या के लिए नहीं रखता है क्योंकि वे एक सीमित परिशुद्धता में मूल्यों का प्रतिनिधित्व।

क्या एक संकलक को ऑप्टिमाइज़ेशन के हिस्से के रूप में सी प्रोग्राम से मशीन कोड उत्पन्न करते समय उपरोक्त प्रतिस्थापन करने की अनुमति है? सी मानक में यह कहां कहता है?

+1

गुणन के लिए कम से कम, यहाँ देखो: http://stackoverflow.com/questions/6430448/why-doesnt-gcc-optimize-aaaaaa-to-aaaaaa –

उत्तर

12

कंपाइलर को "अनुकूलन" करने की अनुमति नहीं है, जिसके परिणामस्वरूप सार मशीन अर्थशास्त्र के अनुसार गणना की गई तुलना में एक अलग मूल्य गणना की जाएगी।

5.1.2.3 कार्यक्रम निष्पादन

[# 1] इस अंतर्राष्ट्रीय स्टैंडर्ड में अर्थ विवरण जो अनुकूलन के मुद्दों अप्रासंगिक हैं में एक सार मशीन के व्यवहार का वर्णन।

[# 3] सार मशीन में, सभी अभिव्यक्तियों का मूल्यांकन द्वारा किया गया है जैसा कि अर्थशास्त्र द्वारा निर्दिष्ट किया गया है।

[# 13] उदाहरण 5 फ्लोटिंग-पॉइंट एक्सप्रेशन के लिए पुनर्मूल्यांकन अक्सर के रूप में परिशुद्धता में सीमाओं के कारण प्रतिबंधित है। कार्यान्वयन आमतौर पर ओवरफ्लो और अंडरफ्लो की अनुपस्थिति में भी गणितीय सहयोगी नियमों के अतिरिक्त या गुणा, और न ही वितरण नियम राउंडऑफ त्रुटि के कारण लागू नहीं हो सकता है।

अपने उदाहरण में:

(a + b) + c 

या यहाँ तक कि कोष्ठकों:

a + b + c 

हम

+ 
/\ 
    + c 
/\ 
a b 

है और संकलक कोड उत्पन्न करने के लिए आवश्यक है के रूप में यदि aके साथ सम्मिलित हैऔर परिणाम c के साथ सम्मिलित है।

+0

सही सिद्धांत। घर ले जाने का आवेदन यह है कि: अपने परिचालनों को किस क्रम में होना चाहिए (उदाहरण के लिए यदि आप छोटे से छोटे, बड़े से बड़े को जोड़ना चाहते हैं), पैरानोआ को संतुष्ट करने के लिए ब्रांड्स में डाल दें, और आप संकलक को तोड़ने वाली चीज़ों के बारे में चिंता करना बंद कर सकते हैं पुनर्व्यवस्था। –

+0

हालांकि, ध्यान दें कि ऑपरेटर प्राथमिकता अच्छी तरह परिभाषित है, उप अभिव्यक्तियों के मूल्यांकन का क्रम निर्दिष्ट नहीं है। दूसरे शब्दों में, कार्यक्रम दाएं से बाएं, या बाएं से दाएं से शुरू होने वाले इस बाइनरी पेड़ का मूल्यांकन कर सकता है, और इसे लगातार इस क्रम में भी रखना नहीं है, और न ही इसे दस्तावेज करने की आवश्यकता है। इसलिए यदि कोई या, बी या सी परिणामस्वरूप प्रभावित दुष्प्रभावों का सामना करता है, तो कोड समस्याग्रस्त हो जाएगा। उदाहरण के लिए कहें कि सी एक ऐसा कार्य है जो एक को संशोधित करता है: तब हम परिणाम नहीं जान सके। – Lundin

5

सी में फ़्लोटिंग पॉइंट गुणात्मक सहयोगी नहीं है।

In C, Floating point multiplication is not associative. 

कुछ सबूत इस सी कोड के साथ है:

तीन यादृच्छिक नाव मूल्यों उठाओ।

Not equal 
Not equal 
Not equal 
Not equal 
DONE 
RUN FINISHED; exit value 0; real time: 10ms; user: 0ms; system: 0ms 

निष्कर्ष::

अपने परीक्षण के लिए, तीन बेतरतीब ढंग से चुना फ्लोटिंग बिंदु गुणा मूल्यों साहचर्य हैं
चेक अगर a*(b*c) कभी (a*b)*c

#include<stdio.h> 
#include<time.h> 
#include<stdlib.h> 
using namespace std; 
int main() { 
    int counter = 0; 
    srand(time(NULL)); 
    while(counter++ < 10){ 
     float a = rand()/100000; 
     float b = rand()/100000; 
     float c = rand()/100000; 

     if (a*(b*c) != (a*b)*c){ 
      printf("Not equal\n"); 
     } 
    } 
    printf("DONE"); 
    return 0; 
} 

के बराबर नहीं कार्यक्रम प्रिंट है समय के बारे में 70%।

+0

ओपी ने पूछा कि क्या संकलक * लगता है * फ्लोट ऑपरेशंस सहयोगी होने के लिए, जब यह अनुकूलन करता है। वह स्पष्ट रूप से जागरूक है कि वे वास्तव में नहीं हैं। –

+0

हां लेकिन यह एक उदाहरण देखने के लिए हमेशा अच्छा लगा जो सिद्धांत की पुष्टि करता है। –