[c#] لماذا هو ضعف. لا تساوي نفسها؟


4 Answers

استخدم Double.IsNaN .

Question

يمكن للشخص أن يفسر لي هذا؟ في C # double.NaN لا يساوي double.NaN

bool huh = double.NaN == double.NaN; // huh = false
bool huh2 = double.NaN >= 0; // huh2 = false
bool huh3 = double.NaN <= 0; // huh3 = false

ما هو الثابت الذي يمكنني مقارنته مع double.NaN وصحيح؟




في الواقع ، لقد عثرت بالفعل على طريقة للتحقق من أن رقم نقطة عائمة IEEE-754 هو en.wikipedia.org/wiki/NaN : وهي قيمة النقطة العائمة الوحيدة (أو نطاق القيم ، لأن هناك العديد من NaNs) التي يتم تقييمها إلى False إذا ما قورنت بنفسها ، أي:

bool isNaN(double v) {
    return v != v;
}

تحت غطاء محرك الأقراص ، قد طريقة Double.IsNaN فعل نفس الشيء. يجب عليك الاستمرار في استخدامه ، لأن السلوك مثير للدهشة تمامًا لأي شخص لا يعرف عن معيار FP.




سبب Double.NaN != Double.NaN بسيط:

هل تتوقع أن يكون 0/0 هو نفسه Math.Sqrt(-3) ؟ ونفس Math.Sqrt(-7) ؟

يوجد خطأ في C # في رأيي حيث لا يتم تجاوز Equals() لـ NaN.

Assert.IsTrue(Double.NaN != Double.NaN);
Assert.IsTrue(Double.NaN.Equals(Double.NaN));

في نفس الوقت

Assert.IsTrue(Double.PositiveInfinity == Double.NegativeInfinity);
Assert.IsTrue(Double.PositiveInfinity.Equals(Double.PositiveInfinity));
// same for Double.NegativeInfinity and Single

استخدم وظائف ثابتة لـ Double و Single ، على سبيل المثال

Double.IsNaN(value) && Double.IsInfinity(value);

أو أكثر تحديدًا:

Double.IsPositiveInfinity(value);
Double.IsNegativeInfinity(value);



هناك وظيفة متخصصة لهذا:

double.IsNan(huh);



السلوك هو عن قصد. السبب في كون NaN يمثل شيئًا ليس رقمًا ، وهذا هو نوع من الإمساك بأشياء كثيرة.

الطريقة الصحيحة لمقارنة شيء ما Double.IsNaN NaN هي استخدام وظيفة Double.IsNaN .




Related



Tags

c# c#   .net .net