C#의 Single.IsNaN() 메서드는 지정된 단정밀도 부동 소수점 값이 NaN(Not a Number, 숫자가 아님)인지 여부를 나타내는 불리언 값을 반환합니다. 이 메서드는 0을 0으로 나누는 것처럼 수학적으로 정의되지 않은 연산의 결과를 안전하게 검사할 때 유용합니다.
구문
메서드의 기본 구문은 다음과 같습니다.
public static bool IsNaN(float f);
매개변수 f는 NaN 여부를 검사할 단정밀도(single-precision) 부동 소수점 숫자입니다. 값이 NaN이면 true를, 그렇지 않으면 false를 반환합니다.
참고 사항
NaN은 자기 자신과도 동등 비교가 되지 않는 특수한 값이므로(NaN == NaN은 false), 비교 연산자 대신 반드시 IsNaN() 메서드를 사용하여 검사해야 합니다.
예제 1: 무한대 값과 일반 값 검사
다음 예제에서는 양의 무한대로 평가되는 값과 일반적인 값에 대해 IsInfinity() 및 IsNaN() 메서드를 함께 사용해 보겠습니다.
using System;
public class Demo {
public static void Main() {
float f1 = 5.0f / 0.0f;
float f2 = 45.5f;
Console.WriteLine("Value1 = " + f1);
Console.WriteLine("Hashcode for Value1 = " + f1.GetHashCode());
Console.WriteLine("TypeCode for Value1 = " + f1.GetTypeCode());
Console.WriteLine("Is Value1 positive or negative infinity? = " + Single.IsInfinity(f1));
Console.WriteLine("Is Value1 NaN? = " + Single.IsNaN(f1));
Console.WriteLine("\nValue2 = " + f2);
Console.WriteLine("Hashcode for Value2 = " + f2.GetHashCode());
Console.WriteLine("TypeCode for Value2 = " + f2.GetTypeCode());
Console.WriteLine("Is Value2 positive or negative infinity? = " + Single.IsInfinity(f2));
Console.WriteLine("Is Value2 NaN? = " + Single.IsNaN(f2));
}
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Value1 = ∞ Hashcode for Value1 = 2139095040 TypeCode for Value1 = Single Is Value1 positive or negative infinity? = True Is Value1 NaN? = False Value2 = 45.5 Hashcode for Value2 = 1110835200 TypeCode for Value2 = Single Is Value2 positive or negative infinity? = False Is Value2 NaN? = False
결과 분석: 5.0f / 0.0f는 양의 무한대(∞)로 평가됩니다. 따라서 IsInfinity()는 true를 반환하지만, 무한대는 NaN이 아니므로 IsNaN()은 false를 반환합니다. 반면 45.5f는 정상적인 숫자이므로 두 메서드 모두 false를 반환합니다.
예제 2: 실제 NaN이 발생하는 경우
이번에는 0.0f를 0.0f로 나누어 실제로 NaN이 생성되는 경우를 살펴보겠습니다.
using System;
public class Demo {
public static void Main() {
float f1 = 5.0f / 0.0f;
float f2 = 0.0f / 0.0f;
Console.WriteLine("Value1 = " + f1);
Console.WriteLine("Hashcode for Value1 = " + f1.GetHashCode());
Console.WriteLine("TypeCode for Value1 = " + f1.GetTypeCode());
Console.WriteLine("Is Value1 positive or negative infinity? = " + Single.IsInfinity(f1));
Console.WriteLine("Is Value1 NaN? = " + Single.IsNaN(f1));
Console.WriteLine("\nValue2 = " + f2);
Console.WriteLine("Hashcode for Value2 = " + f2.GetHashCode());
Console.WriteLine("TypeCode for Value2 = " + f2.GetTypeCode());
Console.WriteLine("Is Value2 positive or negative infinity? = " + Single.IsInfinity(f2));
Console.WriteLine("Is Value2 NaN? = " + Single.IsNaN(f2));
}
}
출력 결과
실행 결과는 다음과 같습니다.
Value1 = ∞ Hashcode for Value1 = 2139095040 TypeCode for Value1 = Single Is Value1 positive or negative infinity? = True Is Value1 NaN? = False Value2 = NaN Hashcode for Value2 = -4194304 TypeCode for Value2 = Single Is Value2 positive or negative infinity? = False Is Value2 NaN? = True
결과 분석: 0.0f / 0.0f는 정의되지 않은 연산이며 그 결과가 NaN입니다. 이 경우 IsNaN() 메서드가 true를 반환하는 것을 확인할 수 있습니다.
마무리
Single.IsNaN() 메서드는 부동 소수점 연산 결과가 유효한 숫자인지 판별하는 데 필수적인 도구입니다. 특히 외부 입력값이나 복잡한 수학 연산의 결과를 다룰 때 NaN 여부를 미리 검사하면 예기치 않은 오류를 방지하고 프로그램의 안정성을 높일 수 있습니다.