سؤال

لدي متغيرات مزدوجة (أو عائمة) قد تكون "فارغة"، كما هو الحال في عدم الاحتفاظ بقيمة صالحة.كيف يمكنني تمثيل هذا الشرط باستخدام النوعين المضمنين float وdouble؟

قد يكون أحد الخيارات عبارة عن غلاف يحتوي على قيمة عائمة وقيمة منطقية، لكن هذا لا يمكن أن ينجح، حيث تحتوي مكتباتي على حاويات تخزن العناصر المزدوجة وليس الكائنات التي تتصرف كعناصر مزدوجة.آخر قد يستخدم NaN (std::numeric_limits).لكنني لا أرى أي طريقة للتحقق من وجود متغير NaN.

كيف يمكنني حل مشكلة الحاجة إلى قيمة تعويم "خاصة" لتعني شيئًا آخر غير الرقم؟

هل كانت مفيدة؟

المحلول

وفي Visual C ++، هناك _isnan(double) وظيفة غير القياسية التي يمكن استيرادها من خلال float.h.

في C، هناك isnan(double) الوظيفة التي كنت يمكن استيراد من خلال math.h.

في C ++، هناك وظيفة isnan (مزدوجة) التي يمكن استيرادها من خلال cmath.

وكما أشار آخرون، وذلك باستخدام ونان يمكن أن يكون هناك الكثير من المتاعب. فهي حالة خاصة لابد من التعامل مع مؤشرات NULL مثل. والفرق هو أن نان لن تسبب عادة مقالب الأساسية وفشل التطبيق، لكنها من الصعب للغاية لتعقب. إذا قررت استخدام لنان، واستخدامها بأقل قدر ممكن. الإفراط في استخدام لنان هو ممارسة الترميز الهجومية.

نصائح أخرى

ولقد فعلت ذلك باستخدام نان:

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

والقيم نان مقارنة أجل المساواة على ذاته سيحقق كاذبة. هذه هي الطريقة التي يمكنك اختبار لنان، ولكن الذي يبدو لتكون صالحة إلا إذا std::numeric_limits<double>::is_iec559 غير صحيح (إذا كان الأمر كذلك، فإنه يتوافق مع ieee754 أيضا).

في C99 هناك ماكرو تسمى isnan لهذا في math.h، والذي يتحقق عددا نقطة عائمة لقيمة نان للغاية.

وانها ليست مدمجة في نوع، لكنني عموما استخدام boost::optional لهذا النوع من الشيء. إذا كنت على الاطلاق لا يمكن استخدام ذلك، وربما المؤشر سوف تفعل خدعة - إذا كان المؤشر NULL، ثم تعرف النتيجة لا تحتوي على قيمة صالحة

قد يكون أحد الخيارات عبارة عن غلاف يحتوي على إعلان عائم منطقي، لكن هذا لا يمكن أن ينجح، حيث تحتوي مكتباتي على حاويات تخزن العناصر المزدوجة وليس الكائنات التي تتصرف كعناصر مزدوجة.

هذا عار.في لغة C++، من السهل إنشاء فئة نموذجية تتحول تلقائيًا إلى السمة المزدوجة (المرجعية) الفعلية.(أو إشارة إلى أي نوع آخر في هذا الشأن.) ما عليك سوى استخدام عامل الإرسال في فئة نموذجية.على سبيل المثال:عامل التشغيل TYPE & () {قيمة الإرجاع؛} يمكنك بعد ذلك استخدام HasValue<double>في أي مكان تستخدم فيه عادةً قيمة مزدوجة.

آخر قد يستخدم NaN (std::numeric_limits).لكنني لا أرى أي طريقة للتحقق من وجود متغير NaN.

مثل litb و جيمس شيك لاحظ أيضًا أن C99 يزودنا بـ isnan().

ولكن كن حذرا مع ذلك!قيم نان تجعل الرياضيات والمنطق مثيرًا للاهتمام حقًا!قد تعتقد أن الرقم لا يمكن أن يكون NOT>=foo وNOT<=foo.ولكن مع NaN، يمكن ذلك.

هناك سبب لاحتفاظي بماكرو WARN-IF-NAN(X) في صندوق الأدوات الخاص بي.لقد واجهت بعض المشاكل المثيرة للاهتمام في الماضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top