2016-04-26 6 views
5

मैं निम्नलिखित कार्यक्रम है:डबल और नाएन की तुलना का परिणाम क्या है?

#include <iostream> 
#include <cmath> 

int main() { 
    double a = 1; 
    double b = nan(""); 

    std::cout << (a > b) << std::endl; 
    std::cout << (b > a) << std::endl; 

    return 0; 
} 

आउटपुट:

0 
0 

nan के अर्थ से सामान्य तौर पर - not a number यह स्पष्ट है कि nan के साथ किसी भी आपरेशन अनिवार्य रूप से व्यर्थ है। IEEE-754 से जो मैंने इंटरनेट में पाया, मुझे पता चला कि एफपीयू में कम से कम एक ऑपरेंड nan है, परिणाम भी nan है, लेकिन मुझे ऊपर के उदाहरण के रूप में सामान्य मूल्य और nan के बीच तुलना के बारे में कुछ भी नहीं मिला।

इसके बारे में मानक क्या कहता है?

+1

एफपीयू फ़ंक्शंस और तुलनात्मक रूप से तार्किक परिणाम संभवतः दो अलग-अलग चीजें हैं। आपके disassembly क्या कहते हैं? – tadman

+0

आपका कोड एक (= हो सकता है) एक '==' तुलना खो सकता है। आपने '<' and '> 'की जांच की लेकिन' == 'के लिए नहीं। शायद आप '<' and '> =' या '<=' and '>' का उपयोग करना चाहते थे। – jotik

उत्तर

7

इसके बारे में मानक क्या कहता है?

सी ++ मानक यह नहीं कहता कि नाएन पर कौन से संचालन व्यवहार करते हैं। यह अनिर्दिष्ट छोड़ दिया गया है। इसलिए, जहां तक ​​सी ++ का संबंध है, कोई भी परिणाम संभव है और अनुमति है।

एएनएसआई/IEEE Std 754-1985 कहते हैं:

5,7। तुलना

... प्रत्येक NaN अपने आप सहित सभी चीज़ों के साथ अनियंत्रित तुलना करेगा। ...

क्या अव्यवस्थित का मतलब है ठीक उसी खंड में सारणी 4 में दिखाया गया है। लेकिन संक्षेप में, इसका मतलब है कि तुलना झूठी वापसी होगी, अगर कोई भी ऑपरेशन NaN है, तो != को छोड़कर सत्य वापस आ जाएगा।

+0

पर एक लिंक प्रदान किया है शायद मैंने इसे पर्याप्त रूप से पर्याप्त नहीं पढ़ा है। धन्यवाद! – Alex

1

0 यहां झूठा मतलब है। नैन किसी भी मूल्य के बराबर या तुलनीय नहीं है इसलिए संचालन का परिणाम झूठा है (0)।

+0

आप जो कहते हैं वह बहुत तार्किक है, लेकिन क्या आप इसे संदर्भित कर सकते हैं जहां इसे परिभाषित किया गया है। – Alex

2

0 जो आप देख रहे हैंइस मामले में है कि स्ट्रीम डिफ़ॉल्ट रूप से गलत के लिए दिखाता है। आप के रूप में true या false उपयोग std::boolalpha यह देखना चाहते हैं:

std::cout << std::boolalpha << (a > b) << std::endl; 

मट्ठा चल बिन्दु मूल्यों जहां से एक मान नेन तो x<y है, x>y, x<=y, x>=y, और x==y सब गलत पर मूल्यांकन करेंगे तुलना, जबकि x!=y हमेशा सच रहेगा। Dr Dobbs वेबसाइट पर एंड्रयू कोएनिग का एक अच्छा लेख है।

जब आप इसके बारे में सोचते हैं तो परिणाम nan नहीं हो सकता है क्योंकि तुलना ऑपरेटर को एक बुलियन लौटने की आवश्यकता होती है जिसमें केवल 2 राज्य हो सकते हैं।

+0

क्या आप कोई संदर्भ प्रदान कर सकते हैं जहां यह व्यवहार परिभाषित किया गया है (मेरा मतलब है NaN और किसी अन्य सामान्य मूल्य के बीच तुलना ऑपरेशन)? – Alex

+0

@Alex - मैंने एक लेख – Sean

0

ठीक है, @ user2079303 के बहुत अच्छे उत्तर पर, दो NaNs हैं: शांत NaN और NaN संकेत। आप अपने प्लेटफार्म पर std::numeric_limits<T>::has_signaling_NaN देख सकते हैं कि नाइन सिग्नलिंग उपलब्ध है।अगर यह सच है और मूल्य std::numeric_limits<T>::signaling_NaN होता है, तो

एक संकेतन NaN अंकगणितीय अभिव्यक्ति के लिए एक तर्क के रूप में किया जाता है, उचित फ्लोटिंग प्वाइंट अपवाद उठाया जा सकता है जब और NaN "शांत" है, कि है, अभिव्यक्ति एक शांत NaN देता है।

वास्तव में एफपी अपवाद प्राप्त करने के लिए आप एफपीयू नियंत्रण शब्द (x87 इकाई के लिए) या एमएक्ससीएसआर रजिस्टर (एसएसई 2 + इकाई के लिए) सेट करना चाहते हैं। यह x86/x64 प्लेटफॉर्म के लिए सच है, समान कार्यक्षमता के लिए अपने प्लेटफ़ॉर्म दस्तावेज़ों की जांच करें

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