Hello!
I encountered the fact that any floating point number placed in a variable when compared with NaN
returns “true
”.
And also comparison via x.Equals(x)
of any simple types always returns “false
”.
Run this code on TinyCLR and on .NET Framework.
Test Code
static void TestDouble()
{
bool b;
double nan = double.NaN;
double pinf = double.PositiveInfinity;
double z = 0.0;
double v = 123.0;
Debug.WriteLine($"nan = {nan.ToString()}");
Debug.WriteLine($"pinf = {pinf.ToString()}");
Debug.WriteLine($"z = {z}");
Debug.WriteLine($"v = {v}");
Debug.WriteLine($"");
Debug.WriteLine($"NaN == NaN {b = double.NaN == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == nan {b = double.NaN == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == Infinity {b = double.NaN == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == pinf {b = double.NaN == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == z {b = double.NaN == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == 0.0 {b = double.NaN == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == v {b = double.NaN == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN == 123.0 {b = double.NaN == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"Infinity == NaN {b = double.PositiveInfinity == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == nan {b = double.PositiveInfinity == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == Infinity {b = double.PositiveInfinity == double.PositiveInfinity,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == pinf {b = double.PositiveInfinity == pinf,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == z {b = double.PositiveInfinity == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == 0.0 {b = double.PositiveInfinity == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == v {b = double.PositiveInfinity == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity == 123.0 {b = double.PositiveInfinity == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"0.0 == NaN {b = 0.0 == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == nan {b = 0.0 == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == Infinity {b = 0.0 == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == pinf {b = 0.0 == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == z {b = 0.0 == z,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == 0.0 {b = 0.0 == 0.0,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == v {b = 0.0 == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0 == 123.0 {b = 0.0 == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"123.0 == NaN {b = 123.0 == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == nan {b = 123.0 == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == Infinity {b = 123.0 == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == pinf {b = 123.0 == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == z {b = 123.0 == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == 0.0 {b = 123.0 == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == v {b = 123.0 == v,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0 == 123.0 {b = 123.0 == 123.0,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"nan == NaN {b = nan == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == nan {b = nan == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == Infinity {b = nan == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == pinf {b = nan == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == z {b = nan == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == 0.0 {b = nan == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == v {b = nan == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan == 123.0 {b = nan == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"pinf == NaN {b = pinf == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == nan {b = pinf == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == Infinity {b = pinf == double.PositiveInfinity,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == pinf {b = pinf == pinf,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == z {b = pinf == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == 0.0 {b = pinf == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == v {b = pinf == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf == 123.0 {b = pinf == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"z == NaN {b = z == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == nan {b = z == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == Infinity {b = z == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == pinf {b = z == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == z {b = z == z,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == 0.0 {b = z == 0.0,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == v {b = z == v,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z == 123.0 {b = z == 123.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"v == NaN {b = v == double.NaN,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == nan {b = v == nan,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == Infinity {b = v == double.PositiveInfinity,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == pinf {b = v == pinf,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == z {b = v == z,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == 0.0 {b = v == 0.0,-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == v {b = v == v,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"v == 123.0 {b = v == 123.0,-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"NaN.Equals(NaN) {b = double.NaN.Equals(double.NaN),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(nan) {b = double.NaN.Equals(nan),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(Infinity) {b = double.NaN.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(pinf) {b = double.NaN.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(z) {b = double.NaN.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(0.0) {b = double.NaN.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(v) {b = double.NaN.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"NaN.Equals(123.0) {b = double.NaN.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"Infinity.Equals(NaN) {b = double.PositiveInfinity.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(nan) {b = double.PositiveInfinity.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(Infinity) {b = double.PositiveInfinity.Equals(double.PositiveInfinity),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(pinf) {b = double.PositiveInfinity.Equals(pinf),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(z) {b = double.PositiveInfinity.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(0.0) {b = double.PositiveInfinity.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(v) {b = double.PositiveInfinity.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"Infinity.Equals(123.0) {b = double.PositiveInfinity.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"0.0.Equals(NaN) {b = 0.0.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(nan) {b = 0.0.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(Infinity) {b = 0.0.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(pinf) {b = 0.0.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(z) {b = 0.0.Equals(z),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(0.0) {b = 0.0.Equals(0.0),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(v) {b = 0.0.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"0.0.Equals(123.0) {b = 0.0.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"123.0.Equals(NaN) {b = 123.0.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(nan) {b = 123.0.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(Infinity) {b = 123.0.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(pinf) {b = 123.0.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(z) {b = 123.0.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(0.0) {b = 123.0.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(v) {b = 123.0.Equals(v),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"123.0.Equals(123.0) {b = 123.0.Equals(123.0),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"nan.Equals(NaN) {b = nan.Equals(double.NaN),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(nan) {b = nan.Equals(nan),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(Infinity) {b = nan.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(pinf) {b = nan.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(z) {b = nan.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(0.0) {b = nan.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(v) {b = nan.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"nan.Equals(123.0) {b = nan.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"pinf.Equals(NaN) {b = pinf.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(nan) {b = pinf.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(Infinity) {b = pinf.Equals(double.PositiveInfinity),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(pinf) {b = pinf.Equals(pinf),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(z) {b = pinf.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(0.0) {b = pinf.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(v) {b = pinf.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"pinf.Equals(123.0) {b = pinf.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"z.Equals(NaN) {b = z.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(nan) {b = z.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(Infinity) {b = z.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(pinf) {b = z.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(z) {b = z.Equals(z),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(0.0) {b = z.Equals(0.0),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(v) {b = z.Equals(v),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"z.Equals(123.0) {b = z.Equals(123.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"");
Debug.WriteLine($"v.Equals(NaN) {b = v.Equals(double.NaN),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(nan) {b = v.Equals(nan),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(Infinity) {b = v.Equals(double.PositiveInfinity),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(pinf) {b = v.Equals(pinf),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(z) {b = v.Equals(z),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(0.0) {b = v.Equals(0.0),-10}{(!b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(v) {b = v.Equals(v),-10}{(b ? "Pass" : "Fail")}");
Debug.WriteLine($"v.Equals(123.0) {b = v.Equals(123.0),-10}{(b ? "Pass" : "Fail")}");
}
Debug Output
nan = NaN
pinf = Infinity
z = 0
v = 123
NaN == NaN False Pass
NaN == nan True Fail
NaN == Infinity False Pass
NaN == pinf True Fail
NaN == z True Fail
NaN == 0.0 False Pass
NaN == v True Fail
NaN == 123.0 False Pass
Infinity == NaN False Pass
Infinity == nan True Fail
Infinity == Infinity True Pass
Infinity == pinf True Pass
Infinity == z False Pass
Infinity == 0.0 False Pass
Infinity == v False Pass
Infinity == 123.0 False Pass
0.0 == NaN False Pass
0.0 == nan True Fail
0.0 == Infinity False Pass
0.0 == pinf False Pass
0.0 == z True Pass
0.0 == 0.0 True Pass
0.0 == v False Pass
0.0 == 123.0 False Pass
123.0 == NaN False Pass
123.0 == nan True Fail
123.0 == Infinity False Pass
123.0 == pinf False Pass
123.0 == z False Pass
123.0 == 0.0 False Pass
123.0 == v True Pass
123.0 == 123.0 True Pass
nan == NaN True Fail
nan == nan True Fail
nan == Infinity True Fail
nan == pinf True Fail
nan == z True Fail
nan == 0.0 True Fail
nan == v True Fail
nan == 123.0 True Fail
pinf == NaN True Fail
pinf == nan True Fail
pinf == Infinity True Pass
pinf == pinf True Pass
pinf == z False Pass
pinf == 0.0 False Pass
pinf == v False Pass
pinf == 123.0 False Pass
z == NaN True Fail
z == nan True Fail
z == Infinity False Pass
z == pinf False Pass
z == z True Pass
z == 0.0 True Pass
z == v False Pass
z == 123.0 False Pass
v == NaN True Fail
v == nan True Fail
v == Infinity False Pass
v == pinf False Pass
v == z False Pass
v == 0.0 False Pass
v == v True Pass
v == 123.0 True Pass
NaN.Equals(NaN) False Fail
NaN.Equals(nan) False Fail
NaN.Equals(Infinity) False Pass
NaN.Equals(pinf) False Pass
NaN.Equals(z) False Pass
NaN.Equals(0.0) False Pass
NaN.Equals(v) False Pass
NaN.Equals(123.0) False Pass
Infinity.Equals(NaN) False Pass
Infinity.Equals(nan) False Pass
Infinity.Equals(Infinity) False Fail
Infinity.Equals(pinf) False Fail
Infinity.Equals(z) False Pass
Infinity.Equals(0.0) False Pass
Infinity.Equals(v) False Pass
Infinity.Equals(123.0) False Pass
0.0.Equals(NaN) False Pass
0.0.Equals(nan) False Pass
0.0.Equals(Infinity) False Pass
0.0.Equals(pinf) False Pass
0.0.Equals(z) False Fail
0.0.Equals(0.0) False Fail
0.0.Equals(v) False Pass
0.0.Equals(123.0) False Pass
123.0.Equals(NaN) False Pass
123.0.Equals(nan) False Pass
123.0.Equals(Infinity) False Pass
123.0.Equals(pinf) False Pass
123.0.Equals(z) False Pass
123.0.Equals(0.0) False Pass
123.0.Equals(v) False Fail
123.0.Equals(123.0) False Fail
nan.Equals(NaN) False Fail
nan.Equals(nan) False Fail
nan.Equals(Infinity) False Pass
nan.Equals(pinf) False Pass
nan.Equals(z) False Pass
nan.Equals(0.0) False Pass
nan.Equals(v) False Pass
nan.Equals(123.0) False Pass
pinf.Equals(NaN) False Pass
pinf.Equals(nan) False Pass
pinf.Equals(Infinity) False Fail
pinf.Equals(pinf) False Fail
pinf.Equals(z) False Pass
pinf.Equals(0.0) False Pass
pinf.Equals(v) False Pass
pinf.Equals(123.0) False Pass
z.Equals(NaN) False Pass
z.Equals(nan) False Pass
z.Equals(Infinity) False Pass
z.Equals(pinf) False Pass
z.Equals(z) False Fail
z.Equals(0.0) False Fail
z.Equals(v) False Pass
z.Equals(123.0) False Pass
v.Equals(NaN) False Pass
v.Equals(nan) False Pass
v.Equals(Infinity) False Pass
v.Equals(pinf) False Pass
v.Equals(z) False Pass
v.Equals(0.0) False Pass
v.Equals(v) False Fail
v.Equals(123.0) False Fail