C / C ++ NaN स्थिरांक (शाब्दिक)?


110

क्या यह C / C ++ में NaNa doubleया असाइन करना संभव है float? जावास्क्रिप्ट में जैसा आप करते हैं: a = NaN। इसलिए बाद में आप जांच सकते हैं कि चर एक संख्या है या नहीं।


यहाँ मैं दिखाता हूँ कि विभिन्न साधनों द्वारा उत्पन्न होने पर विभिन्न NaN कैसे दिखते हैं: stackoverflow.com/questions/18118408/…
Ciro Santilli 郝海东 Na Na 事件

जवाबों:


153

सी में, NANमें घोषित किया जाता है <math.h>

C ++ में, std::numeric_limits<double>::quiet_NaN()में घोषित किया जाता है <limits>

लेकिन यह जाँचने के लिए कि क्या मान NaN है, आप इसकी तुलना दूसरे NaN मान से नहीं कर सकते। इसके बजाय का उपयोग isnan()से <math.h>सी में, या std::isnan()से <cmath>C ++ में।


20
या फिर आप अपने आप को संख्या की तुलना कर सकते हैं - x == xरिटर्न falseiff xNaN है।
आर्ची

7
@ अर्ची: मुझे नहीं लगता कि किसी भी भाषा में इसकी गारंटी है।
माइक सेमोर

3
@MikeSeymour भाषा मानक द्वारा नहीं, लेकिन जहां तक ​​मुझे पता है कि यह काम करना चाहिए अगर कंपाइलर IEEE कंप्रेशर होने का दावा करता है।
Pixelchemist

37
@Pixelchemist: वास्तव में, यह एक विकल्प है यदि आपको ओफ़्स्पैक्शन की आवश्यकता है लेकिन पोर्टेबिलिटी की नहीं। निजी तौर पर, मैं बिना किसी बाधा के पोर्टेबिलिटी पसंद करता हूं, इसलिए मैं इसे खुद नहीं सुझाऊंगा।
माइक सेमोर

9
मामूली नोट: नान एक फ्लोट है, डबल नहीं है। लिंक
ओरियन एल्जेनिल

23

जैसा कि दूसरों ने बताया है कि आप देख रहे हैं, std::numeric_limits<double>::quiet_NaN()हालांकि मुझे कहना है कि मैं cppreference.com दस्तावेज़ पसंद करता हूँ । खासकर क्योंकि यह कथन थोड़ा अस्पष्ट है:

केवल सार्थक अगर std :: num_limits :: has_quiet_NaN == सच है।

और यह पता लगाना आसान था कि इस साइट पर इसका क्या मतलब है, यदि आप इस पर उनके खंड की जांच करते std::numeric_limits::has_quiet_NaNहैं:

यह स्थिरांक सभी फ्लोटिंग-पॉइंट प्रकारों के लिए सार्थक है और यह सच होने की गारंटी है यदि std :: न्यूमेरिक_लिमिट्स :: is_iec559 == सच है।

जैसा कि यहां बताया गया है यदि trueइसका मतलब है कि आपका मंच IEEE 754मानक का समर्थन करता है। यह पिछले सूत्र बताते हैं कि यह अधिकांश स्थितियों के लिए सही होना चाहिए।


9

यह C ++ में संख्यात्मक_लिमिट्स का उपयोग करके किया जा सकता है:

http://www.cplusplus.com/reference/limits/numeric_limits/

ये वे विधियाँ हैं जिन्हें आप शायद देखना चाहते हैं:

infinity()  T   Representation of positive infinity, if available.
quiet_NaN() T   Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T   Representation of signaling "Not-a-Number", if available.

6
+1। विकिपीडिया पर शांत NaN और संकेतन NaN के बारे में कुछ जानकारी है ।
ड्रू नॉक

1

क्या यह संभव है कि NaN को C में डबल या फ्लोट के लिए असाइन किया जाए ...?

हां, C99 के बाद से, (C ++ 11) <math.h>निम्न कार्य प्रदान करता है:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

जो उनके strtod("NAN(n-char-sequence)",0)समकक्षों की तरह हैं और NANअसाइनमेंट के लिए हैं।

// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);

नमूना उत्पादन: (कार्यान्वयन निर्भर)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

1
विभिन्न तारों के लिए आउटपुट के बीच अंतर क्या हैं? हमें ठेठ संख्यात्मक कोड में किसका उपयोग करना चाहिए?
क्वांट_देव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.