2012-05-21 9 views
12

-freciprocal-math जीसीसी मेंजीसीसी में -फ्रेसीप्रोकल-गणित असुरक्षित क्यों है?

double tmp = 1/c; 
double a = b * tmp; 

के लिए निम्न कोड

double a = b/c; 

बदलता है जीसीसी के मैनुअल में यह कहा जाता है कि इस तरह के एक अनुकूलन असुरक्षित है और आईईईई मानकों के स्टिक किया नहीं है। लेकिन मैं एक उदाहरण के बारे में नहीं सोच सकता। क्या आप इसके बारे में एक उदाहरण दे सकते हैं?

+1

बी = सी = 3 –

+0

पर विचार करें। आईईईई के पास नियम नहीं है कि एक कंपाइलर को फ़्लोटिंग पॉइंट का उपयोग कैसे करना चाहिए। उदाहरण के लिए, एक्स^2 अक्सर एक्स * एक्स के लिए ताकत कम हो जाता है जो आमतौर पर तेज़ प्रोग्राम उत्पन्न करता है लेकिन मूल प्रोग्रामर द्वारा निर्दिष्ट गणना से अलग त्रुटि के साथ। तो, @ किड, क्या आपने आईईईई मानक को देखा है कि यह अंकगणित का उपयोग करके कंपाइलर्स पर कितनी सीमाएं रखती हैं? –

+0

@ रेमंड चेन: आईईईई राउंडिंग के बाद (ऊपर? नीचे? यहां तक ​​कि? कोई नहीं?) लागू किया गया है, हो सकता है कि आपका बी = सी = 3 उदाहरण सटीक परिणाम न हो? –

उत्तर

12

10 से विभाजित और 0.1000000000000000055511151231257827021181583404541015625 से गुणा करना एक ही बात नहीं है।

+0

सच है, यह नहीं है। लेकिन फिर यदि आप दस से विभाजित करते हैं तो फ्लोटिंग पॉइंट आपको सटीक उत्तर नहीं देता है। तो यहां तर्क यह प्रतीत होता है कि आप अपने फ़्लोटिंग पॉइंट अंकगणित में कितनी त्रुटि स्वीकार करने के इच्छुक हैं। यदि आप मानक आईईईई फ्लोट करते हैं, तो आपको अपनी गणना में कुछ निश्चित त्रुटि मिलती है (कुछ परिस्थितियों में परिशुद्धता के पूर्ण नुकसान सहित)। यदि आप पारस्परिक गणित करते हैं, तो आपको आईईईई-परिभाषित फ्लोटिंग पॉइंट त्रुटि नहीं मिलती है; चाहे आप कम या ज्यादा प्राप्त करेंगे, आप वास्तविक गणना पर निर्भर करेंगे। –

+1

@IraBaxter, विभाजन आपको एक सटीक परिणाम देता है यदि दोनों ऑपरेटरों का बिल्कुल प्रतिनिधित्व किया जाता है, जो वे पूर्णांक मानों के लिए होंगे। –

+0

@MarkRansom: उह, मैं "1.0/3.0" के लिए एक सटीक (सटीक मतलब क्या है?) परिणाम कैसे प्राप्त करूं? –

0

शायद मैं एक अलग संकलक ध्वज की सोच रहा हूँ, लेकिन ...

कुछ प्रोसेसरों अनुमानित पारस्परिक की गणना के लिए निर्देश दिया है। आरसीपीएसएस ओम x86 (सिमड निर्देश) दिमाग में आता है; इसमें एक सापेक्ष त्रुटि 1.5 * 2^-12 है। उस ध्वज का उपयोग करने से संकलक को लगभग पारस्परिक निर्देश चुनने की अनुमति मिल सकती है, जो आपके आवेदन के आधार पर करने के लिए एक सुरक्षित चीज़ नहीं हो सकती है।

उम्मीद है कि इससे मदद मिलती है।

+0

जीसीसी के साथ, यह -म्रेप ध्वज है। – janneb

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