System.Single.CompareTo メソッド

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

等しいと見なされる値は同じである必要があります。 特に、浮動小数点値が複数の算術演算に依存している場合、精度が失われ、その値が最下位の数字を除いてほぼ同じになるのが一般的です。 このため、メソッドの戻り値は、時には驚くべきもの CompareTo に思えるかもしれません。 たとえば、特定の値を乗算した後、同じ値で除算すると元の値が生成されますが、次の例では、計算値が元の値よりも大きくなることが判明します。 "R" 標準数値書式指定文字列 を使用して 2 つの値のすべての有効桁数を表示すると、計算された値が最下位桁の元の値と異なることを示します。 このような比較の処理については、メソッドの「解説」セクションを Equals(Single) 参照してください。

NaN が (それ自体であっても) 値を持つ別のオブジェクトと等しいとは見なされませんが NaNIComparable<T> インターフェイスでは 0 を返す A.CompareTo(A) 必要があります。

CompareTo(System.Object)

パラメーターは value ;のインスタンスである null 必要があります。それ以外の Single場合は例外がスローされます。 のインスタンスは Single、その値に関係なく、より大きい nullと見なされます。

using System;

public class Example
{
   public static void Main()
   {
       float value1 = 16.5457f;
       float operand = 3.8899982f;
       object value2 = value1 * operand / operand;
       Console.WriteLine("Comparing {0} and {1}: {2}\n",
                         value1, value2, value1.CompareTo(value2));
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2));
   }
}
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = box (value1 * operand / operand)
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
Module Example2
    Public Sub Main()
        Dim value1 As Single = 16.5457
        Dim value2 As Object = value1 * CSng(3.8899982) / CSng(3.8899982)
        Console.WriteLine("Comparing {0} and {1}: {2}",
                          value1, value2, value1.CompareTo(value2))
        Console.WriteLine()
        Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                          value1, value2, value1.CompareTo(value2))
    End Sub
End Module
' The example displays the following output:
'       Comparing 16.5457 and 16.5457: -1
'       
'       Comparing 16.5457 and 16.545702: -1

このメソッドは、インターフェイスをサポート IComparable するために実装されています。

CompareTo(System.Single)

このメソッドはインターフェイスを実装し、パラメーターを System.IComparable<T> オブジェクトに変換する必要がないため、オーバーロードよりも Single.CompareTo(Object) 若干優れたパフォーマンスを value 発揮します。

using System;

public class Example2
{
   public static void Main()
   {
       float value1 = 16.5457f;
       float operand = 3.8899982f;
       float value2 = value1 * operand / operand;
       Console.WriteLine("Comparing {0} and {1}: {2}\n",
                         value1, value2, value1.CompareTo(value2));
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2));
   }
}
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
let value1 = 16.5457f
let operand = 3.8899982f
let value2 = value1 * operand / operand
printfn $"Comparing {value1} and {value2}: {value1.CompareTo value2}\n"
printfn $"Comparing {value1:R} and {value2:R}: {value1.CompareTo value2}"
// The example displays the following output:
//       Comparing 16.5457 and 16.5457: -1
//       
//       Comparing 16.5457 and 16.545702: -1
Module Example
   Public Sub Main()
       Dim value1 As Single = 16.5457
       Dim value2 As Single = value1 * CSng(3.8899982) / CSng(3.8899982)
       Console.WriteLine("Comparing {0} and {1}: {2}",
                         value1, value2, value1.CompareTo(value2))
       Console.WriteLine()
       Console.WriteLine("Comparing {0:R} and {1:R}: {2}",
                         value1, value2, value1.CompareTo(value2))
   End Sub
End Module
' The example displays the following output:
'       Comparing 16.5457 and 16.5457: -1
'       
'       Comparing 16.5457 and 16.545702: -1

拡大変換

プログラミング言語によっては、パラメーター型のビット数がインスタンス型よりも少ない (狭い) メソッドをコーディング CompareTo できる場合があります。 これは、一部のプログラミング言語では、インスタンスと同数のビットを持つ型としてパラメーターを表す暗黙的な拡大変換を実行するためです。

たとえば、インスタンスの型が 〗 Single で、パラメーターの型が 〘 であると Int32します。 Microsoft C# コンパイラは、パラメーターの値をオブジェクトとして Single 表す命令を生成し、インスタンスの値とパラメーターの拡大表現を比較するメソッドを生成 Single.CompareTo(Single) します。

コンパイラが数値型の暗黙的な拡大変換を実行するかどうかを判断するには、プログラミング言語のドキュメントを参照してください。 詳細については、「型変換テーブル」トピックを参照してください。

比較の精度

文書化された精度を超える浮動小数点数の精度は、.NET の実装とバージョンに固有です。 したがって、.NET のバージョン間で 2 つの特定の数値の比較が変わる可能性があります。これは、数値の内部表現の精度が変わる可能性があるためです。