সি / সি ++ ন্যান ধ্রুবক (আক্ষরিক)?


110

এটি কি NaNএকটি doubleবা floatসি / সি ++ এ বরাদ্দ করা সম্ভব ? জাভাস্ক্রিপ্ট মধ্যে মত আপনি না: a = NaN। সুতরাং পরে আপনি পরীক্ষা করতে পারেন ভেরিয়েবলটি একটি সংখ্যা বা না।


এখানে আমি যখন বিভিন্ন উপায়ে উত্পন্ন মত চেহারা কিভাবে বিভিন্ন Nans দেন: stackoverflow.com/questions/18118408/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


153

সি, ইন NANঘোষিত হয় <math.h>

সি ++ এ, std::numeric_limits<double>::quiet_NaN()ঘোষিত হয় <limits>

তবে মানটি NaN কিনা তা পরীক্ষা করার জন্য, আপনি এটি অন্য NaN মানের সাথে তুলনা করতে পারবেন না। পরিবর্তে সি isnan()থেকে <math.h>, বা সি ++ std::isnan()থেকে ব্যবহার করুন <cmath>


20
অথবা আপনি নিজের সাথে নম্বরটি তুলনা করতে পারেন - যদি if হয় NaN হয় x == xreturns falsex
আর্চি

7
@ আর্চি: আমি মনে করি না যে এটি কোনও ভাষায়ই গ্যারান্টিযুক্ত।
মাইক সিমুর

3
@ মাইকসিমুর ভাষার মান অনুসারে নয় তবে যতদূর আমি জানি কম্পাইলার যদি আইইইই অনুগত বলে দাবি করে তবে এটি কাজ করা উচিত
পিক্সেল কেমিস্ট

37
@ পিক্সেল কেমিস্ট: সত্যই, এটি আপনার পক্ষে অপ্রয়োজনীয় প্রয়োজন তবে বহনযোগ্যতার দরকার নেই। ব্যক্তিগতভাবে, আমি অবহেলা ছাড়াই বহনযোগ্যতা পছন্দ করি, তাই আমি নিজেই এটি প্রস্তাব করব না।
মাইক সিমুর

9
গৌণ দ্রষ্টব্য: এনএএন একটি ভাসমান, ডাবল নয়। লিঙ্ক
ওরিওন এলিজিল

23

অন্যরা যেমন চিহ্নিত করেছে আপনি সন্ধান করছেন std::numeric_limits<double>::quiet_NaN()যদিও আমাকে বলতে হবে আমি cppreferences.com নথি পছন্দ করি । বিশেষত কারণ এই বিবৃতিটি কিছুটা অস্পষ্ট:

শুধুমাত্র অর্থবোধক যদি std :: সংখ্যািক_লিট :: has_quiet_NaN == সত্য হয়।

এবং এই সাইটে এটির অর্থ কী তা নির্ধারণ করা সহজ ছিল, যদি আপনি এর বিভাগটি পরীক্ষা করেন std::numeric_limits::has_quiet_NaNতবে:

এই ধ্রুবকটি সমস্ত ভাসমান-পয়েন্টের ধরণের জন্য অর্থবহ এবং এটি স্ট্যান্ডার্ড :: সংখ্যাগত_লিট :: is_iec559 == সত্য হলে গ্যারান্টিযুক্ত।

যা এখানে ব্যাখ্যা করা হয়েছেtrue মানে যদি আপনার প্ল্যাটফর্মটি IEEE 754মানকে সমর্থন করে। এই পূর্ববর্তী থ্রেডটি ব্যাখ্যা করে এটি বেশিরভাগ পরিস্থিতিতে সত্য হওয়া উচিত।


9

এটি সি ++ তে সংখ্যাসূচক_লিট ব্যবহার করে করা যেতে পারে:

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 টি। উইকিপিডিয়ায় শান্ত ন্যাএন এবং সিএনএল সিএনএল সম্পর্কিত কিছু তথ্য রয়েছে ।
ড্রয় নোকস

1

এটি কি ডাবলকে সিএনে ডাবল বা ভাসতে কোনও NaN বরাদ্দ করা সম্ভব ...?

হ্যাঁ, C99 সাল থেকে (সি ++ 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
বিভিন্ন স্ট্রিংয়ের আউটপুটগুলির মধ্যে পার্থক্য কী? টিপিকাল সংখ্যার কোডে আমাদের কোনটি ব্যবহার করা উচিত?
কোয়ান্ট_দেব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.