From 0f315e1b7a96566cc2537b39b6829ad66edaa03f Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Mon, 24 Aug 2020 20:31:14 +0800 Subject: [PATCH 1/3] Align Half.Equals implementation with Double.Equals. --- .../System.Private.CoreLib/src/System/Half.cs | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Half.cs b/src/libraries/System.Private.CoreLib/src/System/Half.cs index 34adab5856cb67..1840f3c61107e6 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Half.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Half.cs @@ -57,7 +57,7 @@ namespace System // Well-defined and commonly used values - public static Half Epsilon => new Half(EpsilonBits); // 5.9604645E-08 + public static Half Epsilon => new Half(EpsilonBits); // 5.9604645E-08 public static Half PositiveInfinity => new Half(PositiveInfinityBits); // 1.0 / 0.0; @@ -151,12 +151,19 @@ private ushort Significand public static bool operator ==(Half left, Half right) { - return left.Equals(right); + if (IsNaN(left) || IsNaN(right)) + { + // IEEE defines that NaN is not equal to anything, including itself. + return false; + } + + // IEEE defines that positive and negative zero are equivalent. + return (left._value == right._value) || AreZero(left, right); } public static bool operator !=(Half left, Half right) { - return !(left.Equals(right)); + return !(left == right); } /// Determines whether the specified value is finite (zero, subnormal, or normal). @@ -415,14 +422,11 @@ public override bool Equals(object? obj) /// public bool Equals(Half other) { - if (IsNaN(this) || IsNaN(other)) + if (this == other) { - // IEEE defines that NaN is not equal to anything, including itself. - return false; + return true; } - - // IEEE defines that positive and negative zero are equivalent. - return (_value == other._value) || AreZero(this, other); + return IsNaN(this) && IsNaN(other); } /// From acd8ac73faadb4a39337b250bad98e66688f3556 Mon Sep 17 00:00:00 2001 From: Huo Yaoyuan Date: Mon, 24 Aug 2020 20:40:18 +0800 Subject: [PATCH 2/3] Add tests for new Half.Equals behaviour. --- src/libraries/System.Runtime/tests/System/HalfTests.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Runtime/tests/System/HalfTests.cs b/src/libraries/System.Runtime/tests/System/HalfTests.cs index de5eddf9f9dc79..574c1ecb756cb3 100644 --- a/src/libraries/System.Runtime/tests/System/HalfTests.cs +++ b/src/libraries/System.Runtime/tests/System/HalfTests.cs @@ -335,7 +335,7 @@ public static IEnumerable Equals_TestData() yield return new object[] { Half.MaxValue, Half.MaxValue, true }; yield return new object[] { Half.MaxValue, Half.MinValue, false }; yield return new object[] { Half.MaxValue, UInt16BitsToHalf(0x0000), false }; - yield return new object[] { Half.NaN, Half.NaN, false }; + yield return new object[] { Half.NaN, Half.NaN, true }; yield return new object[] { Half.MaxValue, 789.0f, false }; yield return new object[] { Half.MaxValue, "789", false }; } @@ -932,5 +932,13 @@ public static void ToSingle(Half half, float verify) float f = (float)half; Assert.Equal(f, verify, precision: 1); } + + [Fact] + public static void EqualityMethodAndOperator() + { + Assert.True(Half.NaN.Equals(Half.NaN)); + Assert.False(Half.NaN == Half.NaN); + Assert.Equal(Half.NaN, Half.NaN); + } } } From c4c2021c650a26f4e13044ba089afb39bd5e1213 Mon Sep 17 00:00:00 2001 From: Prashanth Govindarajan Date: Tue, 25 Aug 2020 10:22:27 -0700 Subject: [PATCH 3/3] Unit test --- src/libraries/System.Runtime/tests/System/HalfTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Runtime/tests/System/HalfTests.cs b/src/libraries/System.Runtime/tests/System/HalfTests.cs index 574c1ecb756cb3..69dd6310959fb1 100644 --- a/src/libraries/System.Runtime/tests/System/HalfTests.cs +++ b/src/libraries/System.Runtime/tests/System/HalfTests.cs @@ -938,6 +938,7 @@ public static void EqualityMethodAndOperator() { Assert.True(Half.NaN.Equals(Half.NaN)); Assert.False(Half.NaN == Half.NaN); + Assert.True(Half.NaN != Half.NaN); Assert.Equal(Half.NaN, Half.NaN); } }