2015-06-09 24 views
8

इसके बजाय, यह ऑपरेशन -1.IND लौटाता है, क्योंकि sqrt(-1) रिटर्न -1.आईएनडी है। क्या C++ reference पर डोमेन त्रुटि का उल्लेख किया गया है कि यह sqrt ऋणात्मक मानों के लिए लौटाता है, यह जानकारी नहीं रखता है कि यह वास्तव में i है?क्यों नहीं (sqrt (-1), 2) वापसी -1?

क्या यह ऑपरेशन सभी नकारात्मक संख्याओं के लिए करने का कोई तरीका है, ताकि यह सही मूल्य लौटा सके, यानी pow(sqrt(-36), 2) वापस आएगा -36?

+0

परिभाषा के अनुसार वास्तविक संख्या की एक शक्ति भी सकारात्मक है। – bereal

+8

आपको एक जटिल संख्या पुस्तकालय की आवश्यकता है। – Mysticial

+0

यदि कुछ भी है, तो इसे 0 को छोड़कर या वापस करना चाहिए, (क्योंकि वास्तविक भाग 0 है और 0^2 0 है)। –

उत्तर

12

आप इस तरह, अपने लक्ष्य को प्राप्त करने std::complex उपयोग कर सकते हैं:

#include <complex> 
#include <iostream> 

int main() { 
    const std::complex<double> result = 
    std::pow(std::sqrt(std::complex<double>(-36,0)), 2); 
    std::cout << result << std::endl; 
    std::cout << "Real part = " << result.real() << std::endl; 
} 

आउटपुट:

(-36,0) 
Real part = -36 

ध्यान दें कि std::sqrt(std::complex) यहाँ प्रयोग किया जाता है।


व्यवहार आप का सामना करना पड़ा के पीछे कारण sqrt के हस्ताक्षर, अर्थात् है:

डबल sqrt (डबल एक्स);

फ्लोट वर्ग (फ्लोट एक्स);

लंबे डबल वर्ग (लंबे डबल एक्स);

डबल वर्ग (टी एक्स); // अभिन्न प्रकार

के लिए अतिरिक्त भार के

जिसका अर्थ है कि कोई फर्क नहीं पड़ता जो प्रोटोटाइप, इस्तेमाल किया जाएगा, यदि आप एक nan की तुलना में बेहतर कुछ भी नहीं हो रही है (या एक + -inf) वापसी प्रकार के बाद से काल्पनिक हिस्सा समर्थन नहीं कर सकता । यही कारण है कि std::complex मौजूद है।

तो, sqrt(-1) को nan द्वारा प्रतिस्थापित किया जाएगा, जिसका pow() द्वारा इलाज नहीं किया जा सकता है, ताकि एक्सपोनेंट की वजह से -1 बरकरार रहे। नतीजतन sqrt() पर कॉल के बाद जानकारी पहले ही खो चुकी है और pow() इसके बारे में कुछ भी नहीं कर सकता है।

+0

मुझे लगता है कि cppreference का एक बेहतर विवरण है [std :: sqrt] (http://en.cppreference.com/w/cpp/numeric/math/sqrt)। –

+0

हां @ShafikYaghmour, cppreference एक अच्छा विकल्प है। – gsamaras

3

std::sqrt is defined डोमेन त्रुटि पर क्रियान्वयन परिभाषित त्रुटि को वापस करने के लिए। इस मामले में (arg := -1) < -0 एक डोमेन त्रुटि है।

std::pow is also defined डोमेन त्रुटि पर कार्यान्वयन परिभाषित त्रुटि को वापस करने के लिए।

तो -1.Ind प्राप्त करना एक व्यावहारिक समाधान है।

जैसा कि रहस्यमय इंगित करता है कि आपको एक जटिल संख्या पुस्तकालय की आवश्यकता है।

6

क्योंकि आप फ़ंक्शन double sqrt(double) पर कॉल कर रहे हैं, और double वापसी मान केवल वास्तविक संख्या, अनंत (साइन के साथ), या NaN स्टोर कर सकता है। i के लिए कोई प्रतिनिधित्व नहीं है।

यदि आप जटिल संख्याएं स्टोर करना चाहते हैं, तो std::complex का उपयोग करें।

4
this sqrt reference page से

:

तो तर्क -0 से कम है, FE_INVALID उठाया जाता है और NaN दिया जाता है।

और फिर this pow reference page

से ... किसी तर्क के NaN है, NaN तो आप बस किसी भी असली x कि नकारात्मक है के लिए pow(sqrt(x), y) उपयोग नहीं कर सकते

दिया जाता है।

+0

बहुत अच्छी व्याख्या भी, आश्चर्य है कि इसमें 0 अपवॉट क्यों हैं। वह बदलाव करेगा! – gsamaras

0

आप आप जटिल के लिए शाब्दिक ऑपरेटरों का उपयोग कर सकते सी ++ 14 का उपयोग कर सकते हैं: # शामिल

<complex> 
#include <iostream> 

int 
main() 
{ 
    using namespace std::literals::complex_literals; 
    auto z = std::pow(std::sqrt(-36.0 + 0.0i), 2.0); 
    std::cout << z << '\n'; 
} 

इस रनिंग मैं:

[email protected]:~$ ./cpow 
(-36,4.40873e-15) 

मैं हाल ही में gcc और clang समर्थन यह जानता हूँ। ऐसा लगता है कि VS2015 भी करता है।

यह वास्तव में एक पोस्ट-सी ++ 14 जोड़ है लेकिन यह के बजाय std नामस्थान में है।

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