2017-09-18 9 views
7

मुझे गैर परिमित फ्लोट के लिए परीक्षण करने और उन्हें खत्म करने की आवश्यकता है। मैं फ्लोट्स का परीक्षण करने के लिए math.IsInf() का उपयोग करने की योजना बना रहा था लेकिन इस उद्देश्य के लिए मैंने math.IsNaN() का उपयोग करके कुछ पीपीएल देखा है। क्या इस उद्देश्य के लिए इनमें से एक बेहतर है? और यदि ऐसा है तो क्यों?गैर-सीमित फ्लोट्स IsNaN या IsInf के परीक्षण के लिए कौन सा बेहतर है?

संपादित करें: इसे रोक दिया गया है क्योंकि यह अस्पष्ट है इसलिए यहां अधिक जानकारी है जो इस प्रश्न को स्पष्ट रूप से स्पष्ट करेगी। मैं "गो प्रोग्रामिंग लैंग्वेज" से अभ्यास 3.1 कर रहा था जो इस program का संदर्भ देता है। समारोह च एक गैर-परिमित float64 मान देता है तो व्यायाम यह पूछता है

, एसवीजी फ़ाइल> अवैध तत्वों (इस शान से हालांकि कई एसवीजी दाता संभाल>) शामिल होंगे। अमान्य बहुभुज को छोड़ने के लिए प्रोग्राम को संशोधित करें।

मैं कोने समारोह

if math.IsInf(z, 0) { 
    return math.NaN(), math.NaN() 
}  

के लिए निम्न जोड़ने और

ax, ay := corner(i+1, j) 
if math.IsNaN(ax) { 
    continue 
} 
bx, by := corner(i, j) 
if math.IsNaN(bx) { 
    continue 
} 
cx, cy := corner(i, j+1) 
if math.IsNaN(cx) { 
    continue 
} 
dx, dy := corner(i+1, j+1) 
if math.IsNaN(dx) { 
    continue 
} 
fmt.Printf("<polygon points='%g,%g %g,%g %g,%g %g,%g'/>\n", 
      ax, ay, bx, by, cx, cy, dx, dy) 

करने के लिए मुख्य में पाश के लिए दूसरे की सामग्रियों को परिवर्तित मैं जाँच करने के लिए चाहता था द्वारा इसे हल करने रंदा था मेरा काम इसलिए मैंने इस समस्या के लिए अन्य पीपीएल ऑनलाइन पोस्ट किए गए किसी भी उत्तर को देखने का फैसला किया। मैंने पाया कि कोई और नहीं, वहां समाधानों में math.IsInf() का उपयोग किया गया था लेकिन अधिकांश ने math.IsNaN() का उपयोग किया था। इससे मुझे आश्चर्य हुआ कि अगर मुझे कुछ याद आ रहा था और math.IsNaN() किसी कारण से इस उद्देश्य के लिए बेहतर था। इसलिए मैंने दोनों कार्यों के लिए गो डॉक्स को देखा। मैंने विकिपीडिया और आईईईई 754 पर नाएन को देखा। मैंने सामान्य वेब खोज की थी कि क्यों हर कोई math.IsNaN() का उपयोग कर रहा था, भले ही यह मेरे लिए कम सहज महसूस कर रहा था। तब मैंने जवाबों के लिए यहां और स्टैक ओवरफ्लो पर खोज की, इसके बाद मुझे वास्तव में कोई जवाब नहीं मिला, इसलिए मैंने एक प्रश्न पोस्ट करने का फैसला किया।

+3

क्या आप जानते हैं कि फ़्लोटिंग-पॉइंट अनंतता और NaN क्या हैं? – user2357112

+0

@ user2347112 - जैसा कि मैं समझता हूं कि नाएन का मतलब है कि संख्या नहीं है और 0/0 जैसी चीजों को प्रतिक्रिया देता है, एक नकारात्मक शक्ति या अनंतता की संख्या। इन्फिनिटी फ्लोट द्वारा प्रतिनिधित्व करने के लिए लंबे समय तक कोई संख्या है। कम से कम यही वह है जो मेरे शोध ने मुझे अब तक विश्वास करने के लिए प्रेरित किया है। – sjtwiv

+7

IsInf सकारात्मक या नकारात्मक अनंतता के लिए परीक्षण करता है। NaN के लिए IsNaN परीक्षण। यदि आपको इनमें से एक या दोनों परीक्षणों की आवश्यकता है, तो फ़ंक्शन या फ़ंक्शंस का उपयोग करें जो आपको चाहिए। – user2357112

उत्तर

4

यदि आपको केवल इनफिनिटी के लिए खाते की आवश्यकता है, तो math.IsInf() पर्याप्त होना चाहिए। हालांकि, अगर आपको संख्याओं और मूल्यों दोनों के खिलाफ सुरक्षा करने की आवश्यकता है जो संख्याओं की संख्या नहीं हैं, तो आपको दोनों संयोजनों का उपयोग करना चाहिए।

तैरता के बारे में अधिक पढ़ने के लिए: https://en.wikipedia.org/wiki/IEEE_754

math.IsNaN() का एक उदाहरण अनंत मूल्यों के लिए काम नहीं कर रहा: https://play.golang.org/p/blHjr8i7p9

-2

गणितीय बोल रहा है, यह अजीब है कि NaN प्रोग्रामिंग में एक बात कारण अमान्य भाव (दुर्भाग्य से संकलित नहीं किया जाना चाहिए है हालांकि वे करते हैं)।

math.IsNaN() का उपयोग करें यदि आपका नंबर वास्तविक रेखा पर फिट नहीं होगा (जैसे वर्ग (-1), उदाहरण के लिए) या यदि यह गणितीय रूप से अपरिभाषित है (जैसे 0/0)।

math.IsInf() का उपयोग करें यदि आपका नंबर वास्तव में बड़ा हो सकता है (या तो सकारात्मक या नकारात्मक दिशा में) जैसे कि आपके पास इसका प्रतिनिधित्व करने के लिए पर्याप्त बिट्स नहीं हैं, या यदि यह वास्तव में अनंत होना चाहिए।

+2

अभिव्यक्ति वैध हो सकती है लेकिन अभी भी बेवकूफ परिणाम उत्पन्न करती है (उदा .: divide-by-zero)। पूरे कार्यक्रम का मूल्यांकन किये बिना आप इस अजीबता को हल करने का प्रस्ताव कैसे देते हैं? यह छिपाने में सिर्फ रोकथाम की समस्या है: https://en.wikipedia.org/wiki/Halting_problem – blz

+0

डाउनवॉटिंग के लिए धन्यवाद, लेकिन शून्य द्वारा विभाजन भी एक अमान्य अभिव्यक्ति है जिसे संकलित नहीं करना चाहिए (या कम से कम रनटाइम त्रुटि उत्पन्न करना, उदाहरण के लिए NaN) ... क्या आप गणितीय सीमा से परिचित हैं? वैसे भी, स्मार्ट प्रोग्रामिंग भाषा क्षितिज पर हैं (लेकिन जल्द ही मुख्यधारा के गोद लेने को देखने की संभावना नहीं है)। आप निर्भर प्रकार और/या कुल कार्यात्मक प्रोग्रामिंग करना चाहते हैं। –

+1

डाउनवोट मुझसे नहीं है :) मैं गणितीय सीमाओं को ठीक से समझता हूं - क्या आप समझते हैं कि संकलन-समय विश्लेषण ऐसा क्यों नहीं कर सकता है जिसे आप करना चाहते हैं? क्या आप समझते हैं कि छिपाने में यह कैसे रोक रहा है? सरल उदाहरण: '1/रैंडिंट (0, 10)'। क्या यह संकलित होना चाहिए? इस उदाहरण के बारे में: '1/int (user_input (" एक अंक दर्ज करें "))'? आपके विकल्प हैं (ए) संकलित करने से इनकार करते हैं क्योंकि यदि आपको रनटाइम पर '0' मान मिलता है तो आपको' 0' प्राप्त हो सकता है या (बी) 'NaN' उत्पन्न हो सकता है। – blz

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