Single.Equals 메서드

정의

Single의 두 인스턴스가 같은 값을 표시하는지를 나타내는 값을 반환합니다.

오버로드

Equals(Object)

이 인스턴스가 지정된 개체와 같은지를 표시하는 값을 반환합니다.

Equals(Single)

이 인스턴스의 값과 지정된 Single 개체의 값이 같은지를 나타내는 값을 반환합니다.

Equals(Object)

이 인스턴스가 지정된 개체와 같은지를 표시하는 값을 반환합니다.

public:
 override bool Equals(System::Object ^ obj);
public override bool Equals (object obj);
public override bool Equals (object? obj);
override this.Equals : obj -> bool
Public Overrides Function Equals (obj As Object) As Boolean

매개 변수

obj
Object

이 인스턴스와 비교할 개체입니다.

반환

Boolean

trueobj의 인스턴스이고 이 인스턴스의 값과 같으면 Single이고, 그렇지 않으면 false입니다.

예제

다음 코드 예제는 Equals 메서드.

obj1 = (Single)500;

if ( a.Equals( obj1 ) )
{
   Console::WriteLine( "The value type and reference type values are equal." );
}
obj1 = (Single)500;
if (a.Equals(obj1)) {
    Console.WriteLine("The value type and reference type values are equal.");
}
Obj1 = CType(500, Single)

If A.Equals(Obj1) Then
    Console.WriteLine("The value type and reference type values are equal.")
End If

설명

두 값의 정밀도가 다르기 때문에 두 개의 Equals 동등 값이 같지 않을 수 있으므로 메서드는 주의해서 사용해야 합니다. 다음 예제에서는 Single 값 .3333 및 Single 1을 3으로 나누어 반환된 이 같지 않다고 보고합니다.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

같은지 비교하는 대신 한 가지 권장되는 기술에는 두 값 간의 허용되는 차이 여백(예: 값 중 하나의 .01%)을 정의하는 것이 포함됩니다. 두 값 간의 차이의 절대값이 해당 여백보다 크거나 같으면 전체 자릿수 차이로 인해 차이가 발생할 수 있으므로 값이 같을 가능성이 높습니다. 다음 예제에서는 이 기술을 사용하여 이전 코드 예제에서 같지 않은 두 값인 .33333과 1/3을 Single 비교합니다.

// Initialize two floats with apparently identical values
float float1 = .33333f;
object float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - (float) float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Object = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - CSng(single2)) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

이 경우 값은 같습니다.

참고

Epsilon는 범위가 0에 가까운 양수 값의 최소 식을 정의하므로 차이의 여백은 보다 커야 Epsilon 합니다. 일반적으로 보다 많은 Epsilon 배입니다.

문서화된 전체 자릿수를 초과하는 부동 소수점 숫자의 전체 자릿수는 .NET Framework 구현 및 버전에 따라 다릅니다. 따라서 숫자의 내부 표현의 전체 자릿수가 변경될 수 있으므로 .NET Framework 버전 간에 두 개의 특정 숫자 비교가 변경될 수 있습니다.

호출자 참고

컴파일러 오버로드 확인은 두 메서드 오버로드의 동작에서 명백한 차이를 고려할 수 Equals(Object) 있습니다. 인수와 사이의 암시적 obj Single 변환이 정의되고 인수가 로 형식화되지 않은 경우 Object 컴파일러가 암시적 변환을 수행하고 메서드를 호출할 수 Equals(Single) 있습니다. 그렇지 않으면 Equals(Object) 인수가 값이 아닌 경우 항상 를 반환하는 false obj 메서드를 Single 호출합니다. 다음 예제에서는 두 메서드 오버로드 간의 동작 차이를 보여 줍니다. Visual Basic 및 C#의 및 을 제외한 모든 기본 숫자 형식의 경우 Double Decimal Double true 컴파일러가 자동으로 확대 변환을 수행하고 메서드를 호출하기 때문에 첫 번째 비교는 를 Equals(Single) 반환하고 두 번째 비교는 false 메서드를 호출하기 때문에 를 반환합니다. Equals(Object)

추가 정보

적용 대상

Equals(Single)

이 인스턴스의 값과 지정된 Single 개체의 값이 같은지를 나타내는 값을 반환합니다.

public:
 virtual bool Equals(float obj);
public bool Equals (float obj);
override this.Equals : single -> bool
Public Function Equals (obj As Single) As Boolean

매개 변수

obj
Single

이 인스턴스와 비교할 개체입니다.

반환

Boolean

true가 이 인스턴스와 같으면 obj이고, 그러지 않으면 false입니다.

구현

설명

이 메서드는 System.IEquatable<T> 인터페이스를 구현하며 매개 변수를 개체로 변환할 필요가 없기 때문에 보다 약간 더 잘 Equals obj 수행됩니다.

확대 변환

프로그래밍 언어에 따라 Equals 매개 변수 형식에 인스턴스 형식보다 적은 비트(좁은 비트)가 있는 메서드를 코딩할 수 있습니다. 이는 일부 프로그래밍 언어가 인스턴스만큼 많은 비트를 가진 형식으로 매개 변수를 나타내는 암시적 확대 변환을 수행하기 때문에 가능합니다.

예를 들어 인스턴스 형식이 Single 이고 매개 변수 형식이 인 경우를 가정해 Int32 보겠습니다. Microsoft C# 컴파일러는 매개 변수의 값을 개체로 나타내는 명령을 Single 생성한 다음 Single.Equals(Single) 인스턴스의 값과 매개 변수의 확장된 표현을 비교하는 메서드를 생성합니다.

컴파일러가 숫자 형식의 암시적 확대 변환을 수행하는지 확인하려면 프로그래밍 언어의 설명서를 참조하세요. 자세한 내용은 형식 변환 테이블 항목을 참조하세요.

비교의 정밀도

두 값의 전체 자릿수가 다르기 때문에 두 개의 Equals 동등 값이 같지 않을 수 있으므로 메서드는 주의해서 사용해야 합니다. 다음 예제에서는 Single 값 .3333 및 Single 1을 3으로 나누어 반환된 이 같지 않다고 보고합니다.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = 1/3;
// Compare them for equality
Console.WriteLine(float1.Equals(float2));    // displays false
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Compare them for equality
Console.WriteLine(single1.Equals(single2))    ' displays False

같음 비교와 관련된 문제를 방지하는 한 가지 비교 기술에는 두 값 간의 허용되는 차이 여백(예: 값 중 하나의 .01%)을 정의하는 작업이 포함됩니다. 두 값 간의 차이의 절대값이 해당 여백보다 적거나 같으면 전체 자릿수 차이의 결과일 가능성이 높으므로 값이 같을 수 있습니다. 다음 예제에서는 이 기술을 사용하여 이전 코드 예제에서 같지 않은 것으로 발견된 두 값인 .33333과 1/3을 Single 비교합니다.

// Initialize two floats with apparently identical values
float float1 = .33333f;
float float2 = (float) 1/3;
// Define the tolerance for variation in their values
float difference = Math.Abs(float1 * .0001f);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(float1 - float2) <= difference)
   Console.WriteLine("float1 and float2 are equal.");
else
   Console.WriteLine("float1 and float2 are unequal.");
' Initialize two singles with apparently identical values
Dim single1 As Single = .33333
Dim single2 As Single = 1/3
' Define the tolerance for variation in their values
Dim difference As Single = Math.Abs(single1 * .0001f)

' Compare the values
' The output to the console indicates that the two values are equal
If Math.Abs(single1 - single2) <= difference Then
   Console.WriteLine("single1 and single2 are equal.")
Else
   Console.WriteLine("single1 and single2 are unequal.")
End If

이 경우 값은 같습니다.

참고

Epsilon는 범위가 0에 가까운 양수 값의 최소 식을 정의하므로 차이의 여백은 보다 커야 Epsilon 합니다. 일반적으로 보다 많은 Epsilon 배입니다. 따라서 값이 같은지 비교할 때는 를 사용하지 않는 것이 Epsilon Double 좋습니다.

같음 비교와 관련된 문제를 방지하는 두 번째 방법은 두 부동 소수점 숫자 간의 차이를 절대값과 비교하는 것입니다. 차이가 절대값보다 적거나 같으면 숫자는 같습니다. 이보다 크면 숫자가 같지 않습니다. 이 작업을 수행하는 한 가지 방법은 임의로 절대값을 선택하는 것입니다. 그러나 허용되는 차이 여백은 값의 크기에 따라 달라지므로 문제가 Single 됩니다. 두 번째 방법은 부동 소수점 형식의 디자인 기능을 활용합니다. 두 부동 소수점 값의 정수 표현에서 mantissa 구성 요소 간의 차이는 두 값을 구분하는 가능한 부동 소수점 값의 수를 나타냅니다. 예를 들어 가 값이 0인 로 Epsilon 작업할 때 가장 작은 표현 가능한 값이므로 0.0과 는 1 사이의 차이가 Epsilon Single 있습니다. 다음 예제에서는 이 기술을 사용하여 이전 코드 예제와 메서드가 다른 것으로 확인되는 두 값인 .33333과 1/3을 Double Equals(Single) 비교합니다. 이 예제에서는 및 메서드를 사용하여 BitConverter.GetBytes BitConverter.ToInt32 단정밀도 부동 소수점 값을 정수 표현으로 변환합니다.

using System;

public class Example
{
   public static void Main()
   {
      float value1 = .1f * 10f;
      float value2 = 0f;
      for (int ctr = 0; ctr < 10; ctr++)
         value2 += .1f;
         
      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1));
   }

   public static bool HasMinimalDifference(float value1, float value2, int units)
   {
      byte[] bytes = BitConverter.GetBytes(value1);
      int iValue1 = BitConverter.ToInt32(bytes, 0);
      
      bytes = BitConverter.GetBytes(value2);
      int iValue2 = BitConverter.ToInt32(bytes, 0);
      
      // If the signs are different, return false except for +0 and -0.
      if ((iValue1 >> 31) != (iValue2 >> 31))
      {
         if (value1 == value2)
            return true;
          
         return false;
      }

      int diff = Math.Abs(iValue1 - iValue2);

      if (diff <= units)
         return true;

      return false;
   }
}
// The example displays the following output:
//        1 = 1.00000012: True
Module Example
   Public Sub Main()
      Dim value1 As Single = .1 * 10
      Dim value2 As Single = 0
      For ctr As Integer =  0 To 9
         value2 += CSng(.1)
      Next
               
      Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2,
                        HasMinimalDifference(value1, value2, 1))
   End Sub

   Public Function HasMinimalDifference(value1 As Single, value2 As Single, units As Integer) As Boolean
      Dim bytes() As Byte = BitConverter.GetBytes(value1)
      Dim iValue1 As Integer =  BitConverter.ToInt32(bytes, 0)
      
      bytes = BitConverter.GetBytes(value2)
      Dim iValue2 As Integer =  BitConverter.ToInt32(bytes, 0)
      
      ' If the signs are different, Return False except for +0 and -0.
      If ((iValue1 >> 31) <> (iValue2 >> 31)) Then
         If value1 = value2 Then
            Return True
         End If           
         Return False
      End If

      Dim diff As Integer =  Math.Abs(iValue1 - iValue2)

      If diff <= units Then
         Return True
      End If

      Return False
   End Function
End Module
' The example displays the following output:
'       1 = 1.00000012: True

문서화된 전체 자릿수를 초과하는 부동 소수점 숫자의 전체 자릿수는 .NET Framework 구현 및 버전에 따라 다릅니다. 따라서 두 숫자를 비교하면 숫자의 내부 표현의 전체 자릿수가 변경될 수 있으므로 .NET Framework 버전에 따라 다른 결과가 생성될 수 있습니다.

호출자 참고

컴파일러 오버로드 확인은 두 메서드 오버로드의 동작에서 명백한 차이를 고려할 수 Equals(Object) 있습니다. 인수와 사이의 암시적 obj Single 변환이 정의되고 인수가 로 형식화되지 않은 경우 Object 컴파일러가 암시적 변환을 수행하고 메서드를 호출할 수 Equals(Single) 있습니다. 그렇지 않으면 Equals(Object) 인수가 값이 아닌 경우 항상 를 반환하는 false obj 메서드를 Single 호출합니다. 다음 예제에서는 두 메서드 오버로드 간의 동작 차이를 보여 줍니다. Visual Basic 및 C#의 및 을 제외한 모든 기본 숫자 형식의 경우 Double Decimal Double true 컴파일러가 자동으로 확대 변환을 수행하고 메서드를 호출하기 때문에 첫 번째 비교는 를 Equals(Single) 반환하고 두 번째 비교는 false 메서드를 호출하기 때문에 를 반환합니다. Equals(Object)

추가 정보

적용 대상