هل هي فكرة جيدة لاستخدام IEEE754 النقطة العائمة نان على القيم التي لا ؟

StackOverflow https://stackoverflow.com/questions/1036686

سؤال

هل هي فكرة جيدة لاستخدام IEEE754 النقطة العائمة نان (not-a-عدد) من أجل القيم التي هي غير محددة غير الرياضية الأسباب ؟

في حال لم تحدد بعد لأن القيم لا ترد من بعض الأجهزة الأخرى.السياق هو جزءا لا يتجزأ من النظام باستخدام IEC1131 REAL32 القيم. تحرير: لغة البرمجة C, لذلك نحن على الأرجح استخدام نان isnanf(x), والتي هي من C99.على الرغم من أننا قد تحتاج إلى المزيد من الالتواءات الحصول على هذه في نظام التشغيل طبقة توافق.

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

يبدو أن الحل نظيفة استخدام نان, ولكن ربما هو من المتاعب أكثر مما يستحق ونحن يجب اختيار بعض القيمة ؟

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

المحلول

فقط لاحظت هذا السؤال.

هذا هو واحد من الاستخدامات NaNs أن IEEE 754 اللجنة في الاعتبار (كنت عضوا في اللجنة).نشر قواعد NaNs في الحساب جعل هذا جذابة للغاية ، لأنه إذا كان لديك نتيجة سلسلة طويلة من العمليات الحسابية التي تنطوي على بعض تهيئة البيانات ، فلن خطأ نتيجة نتيجة صحيحة.فإنه يمكن أيضا جعل تتبع من خلال الحسابات الخاصة بك لمعرفة أين كنت تستخدم تهيئة البيانات أكثر وضوحا.

وقال ان هناك بعض المزالق التي هي خارج 754 اللجنة السيطرة:كما ذكر آخرون ، ليس كل الأجهزة تدعم نان القيم في السرعة التي يمكن أن تؤدي في أداء المخاطر.لحسن الحظ, لا تفعل في كثير من الأحيان الكثير من العمليات على تهيئة البيانات في الأداء الحرجة الإعداد.

نصائح أخرى

NaNs هي معقولة خيار 'لا قيمة' sentential (د لغة البرمجة يستخدم منهم غير مهيأ القيم ، على سبيل المثال) ، ولكن لأن أي مقارنات التي تنطوي عليها سوف تكون كاذبة ، يمكنك الحصول على الكثير من المفاجآت:

  • if (result == DEFAULT_VALUE), لن يعمل كما هو متوقع إذا DEFAULT_VALUE هو نان ، جون المذكورة.

  • أنها يمكن أيضا أن يسبب مشاكل مع مجموعة التحقق إذا كنت غير دقيق.النظر في وظيفة:

bool isOutsideRange(double x, double minValue, double maxValue)
{
    return x < minValue || x > maxValue;
}

إذا كانت س نان ، هذه الدالة بشكل غير صحيح التقرير أن x هو بين minValue و maxValue.

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

[تحرير:أنا في البداية تمكنت من نوع "أي مقارنات التي تنطوي عليها سوف يكون صحيحا" أعلاه ، وهو ليس ما قصدته, و هو خطأ, أنهم جميعا كاذبة ، وبصرف النظر نان != نان ، وهو صحيح]

لقد استخدمت NaNs في حالات مماثلة فقط بسبب أن:المعتاد الافتراضي التهيئة القيمة 0 هي أيضا قيمة صالحة.NaNs تعمل بشكل جيد حتى الآن.

إنه سؤال جيد, بالمناسبة, لماذا الافتراضي التهيئة القيمة هي عادة (على سبيل المثال ، في جافا أنواع بدائية) 0 وليس نان.لا يمكن أيضا أن 42 أو أيا كان ؟ وأتساءل ما هو المنطق من الأصفار.

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

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

كن حذرا مع نان...أنها يمكن أن تنتشر كالنار في الهشيم إذا لم تكن حذرا.

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

د يستخدم هذا النحو المنطقي إعطاء يطفو نان كما الافتراضي.(وأنا لست متأكدا من أنني أتفق مع.)

مشاعري هي أنه قليلا المباراة, ولكن على الأقل كل الأرقام التي تجعل العمليات مع هذا نان القيمة يعطي نان نتيجة - عندما ترى نان في تقرير الشوائب ، على الأقل أنت تعرف ما هو نوع الخطأ الذى الصيد.

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

فقط تذكر أنه اعتمادا على البيئة الخاصة بك ، ربما تحتاج إلى طريقة خاصة للكشف عن NaNs (لا مجرد استخدام if (x == float.NaN) أو ما يعادله.)

هذا يبدو وكأنه وسيلة جيدة للاستفادة من nans لي.أتمنى لو كان يفكر في ذلك...

طبعا هي من المفترض أن تنتشر مثل الفيروس, هذه هي النقطة.

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

باستخدام نان كقيمة افتراضية غير معقول.

علما أن بعض التعابير مثل (0.0 / 0.0) ، والعودة نان.

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