5

std::pow() का उपयोग करके किस तरह की स्थिरता समस्या उत्पन्न होती है या हल हो जाती है?पुनरावृत्त गुणा की तुलना में std :: pow() की संख्यात्मक स्थिरता क्या है?

  • यह और अधिक स्थिर (तेज बिल्कुल अलग या, या) एक साधारण समारोह log(n) दोहराया पलता अगर प्रतिपादक एक पूर्णांक होना करने के लिए जाना जाता है प्रदर्शन करने के लिए लागू करने के लिए सामान्य रूप में हो जाएगा?

  • std::sqrt(x)std::pow(x, k/2) फ़ॉर्म की तुलना में स्थिरता के अनुसार तुलना करता है? क्या उपरोक्त के लिए एक पूर्णांक शक्ति को बढ़ाने के लिए पसंदीदा विधि चुनने के लिए समझदारी होगी, फिर एक वर्ग रूट में गुणा करें, या मुझे लगता है कि std::pow() इस के लिए मशीन परिशुद्धता के लिए तेज़ और सटीक है? यदि k = 1 है, तो std::sqrt() से कोई अंतर है?

  • std::pow(x, k/2) या std::sqrt(x) के पूर्णांक एक्सपोनेंटिएशन के लिए उपर्युक्त विधि, स्थिरता के अनुसार, कैसे उपरोक्त विधि की तुलना करेगा?

और बोनस के रूप में, गति अंतर क्या होने की संभावना है?

+8

आप एक प्रश्न पूछ रहे हैं कि कौन से हिस्से प्रयोग और विश्लेषण के लिए उपयुक्त हैं। आपके प्रयोगों और विश्लेषण के परिणाम क्या हैं? –

+0

पास्कल क्यूओक का जवाब उत्कृष्ट है, लेकिन मैं जोड़ूंगा कि 'पाउ' के बहुत सारे पारंपरिक और लोकप्रिय कार्यान्वयन अपमानजनक रूप से क्रोधित हैं। – tmyklebu

+0

@tmyklebu, कौन सा? – trbabb

उत्तर

7

यह एक साधारण समारोह को लागू करने के लिए लॉग (एन) को करने के लिए पलता दोहराया अगर प्रतिपादक एक पूर्णांक माना जाता है सामान्य रूप में और अधिक स्थिर (या तेज, या बिल्कुल अलग) हो जाएगा?

पूर्णांक घातांक के लिए exponentiation by squaring का परिणाम सामान्य pow से कम सही में है, लेकिन दोनों इस अर्थ में कि करीब आदानों करीब परिणाम में स्थिर रहे हैं। आप गुणा करके सापेक्ष त्रुटि के 0.5 यूएलपी को शुरू करने के लिए एक्सपोनेंटिएशन की उम्मीद कर सकते हैं (उदाहरण के लिए, एक्स कंप्यूटिंग के लिए त्रुटि के 1 यूएलपी x * x * x)।

जब दूसरा तर्क n स्थिर रूप से 2 होना जाता है, तो सभी माध्यमों से x nx * x के रूप में लागू करें। उस स्थिति में यह किसी भी संभावित विकल्प से तेज़ और अधिक सटीक है।

कैसे std करता :: sqrt (x), की तुलना स्थिरता के लिहाज से, प्रपत्र std :: पॉव के बारे में कुछ करने के लिए (एक्स, k/2)

पहले, sqrt की सटीकता नहीं कर सकते आईईईई 754 कार्यान्वयन के लिए हराया जाए, क्योंकि sqrt बुनियादी परिचालनों में से एक है कि यह मानक यथासंभव सटीक होना आवश्यक है।

लेकिन आप sqrt के बारे में पूछ नहीं कर रहे हैं, तो आप पूछ रहे हैं (मुझे लगता है कि) एक्स के < के बारे में गणना n> * sqrt (एक्स) के रूप में pow(x, n + 0.5) करने का विरोध किया। फिर, सामान्य रूप से, pow के गुणवत्ता कार्यान्वयन के लिए, आप विकल्पों की तुलना में अधिक सटीक होने के लिए pow(x, n + 0.5) की अपेक्षा कर सकते हैं। यद्यपि sqrt(x) की गणना 0.5 यूएलपी तक की जाएगी, गुणात्मकता 0.5 यूएलपी तक की अपनी अनुमानितता का परिचय देती है, और सब कुछ, एक अच्छी तरह से कार्यान्वित फ़ंक्शन के लिए एक कॉल में रुचि रखने वाले परिणाम को प्राप्त करना बेहतर होता है। pow का गुणवत्ता कार्यान्वयन आपको इसके परिणाम के लिए सटीकता का 1 यूएलपी देगा, और सर्वोत्तम कार्यान्वयन 0.5 यूएलपी "गारंटी" देगा।

और बोनस के रूप में, गति अंतर क्या होने की संभावना है?

आप पहले से जानते हैं कि प्रतिपादक एक छोटे पूर्णांक या 0.5 की एक से अधिक हो सकता है, तो आप जानकारी है कि pow के implementer नहीं था, ताकि आप उनमें से कम से कम लागत से हरा कर सकते हैं जा रहा है यह निर्धारित करने के लिए परीक्षण कि दूसरा तर्क एक छोटा पूर्णांक है। इसके अलावा, एक गुणवत्ता कार्यान्वयन के कार्यान्वयन का उद्देश्य स्क्वायरिंग द्वारा सरल एक्सपोनिएशन की तुलना में अधिक सटीक परिणाम का लक्ष्य है। दूसरी तरफ, pow के कार्यान्वयनकर्ता बेहतर सटीकता के बावजूद औसत निष्पादन समय को कम करने के लिए बेहद परिष्कृत तकनीकों का उपयोग कर सकते हैं: उदाहरण के लिए CRlibm's implementation देखें। pow के सर्वोत्तम कार्यान्वयन के बारे में बात करते समय मैंने अंदरूनी उद्धरणों के ऊपर क्रिया "गारंटी" डाली क्योंकि pow एक ऐसा कार्य है जिसके लिए सीआरएलआईबीएम की 0.5 यूएलपी सटीकता गारंटी only “with astronomical probability” है।

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