سؤال

لماذا أحصل على هذه النتيجة؟

[TestMethod]
public void nan_test()
{
    Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
    Assert.AreEqual(1, double.NaN);       <-- Fails
}

ما الفرق التي لدى الدلتا في تأكيد النان تساوي رقمًا؟ بالتأكيد يجب أن تعود دائما كاذبة. أنا على دراية بـ Isnan ، لكن هذا ليس مفيدًا هنا (انظر أدناه).

الخلفية: لدي وظيفة تعود إلى النان (خطأ) ، كان من المفترض أن يكون رقمًا حقيقيًا ولكن لا يزال الاختبار قد تم تمريره. أنا أستخدم الدلتا لأنها مساواة مزدوجة الدقة ، والاختبار الأصلي يستخدم 1E-9.

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

المحلول

عندما تستخدم Assert.AreEqual(1, double.NaN), ، يحاول اختبار المساواة على الأرقام وبالطبع يفشل ، منذ ذلك الحين double.NaN لا يساوي أي شيء.

عندما تفعل Assert.AreEqual(1, double.NaN, 1E-1), ، يجب أن تفعل الحساب على الأرقام. على وجه التحديد ، فإنه يحسب

Math.Abs((double) (expected - actual)) > delta
Math.Abs(1 - double.NaN) > 1E-1
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=)

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

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

نصائح أخرى

إلقاء نظرة هنا: لماذا يمر Assert.areequal (1.0 ، double.nan ، 1.0)؟

تعديل:

هناك بالتأكيد خطأ في Assert.AreEqual. في VS 2008 Microsoft.VisualStudio.feralityTools.Unittestframework ، تم ترميزها على أنها

if (Math.Abs((double) (expected - actual)) > delta)
{
    // report error
}

كما في قضيتك Math.Abs((double) (expected - actual)) هو double.NaN, عائدات المقارنة false :-)

هل يمكنك استخدام هذا الاختبار لـ NAN بدلاً من ذلك؟

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