Inconsistency of comparisons of simple types

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