Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- #csharp #double #decimal #실수형 #정밀도 #부동소수점 #고정소수점 #금융계산 #과학계산 #csharp세미나 #닷넷기초
- 빛썸
- #csharp #스택과힙 #메모리구조 #값형식 #참조형식 #박싱 #가비지컬렉션 #힙메모리 #메서드스택 #csharp세미나
- #csharp #부동소수점 #반올림오차 #실수계산 #float #double #decimal #mathround #정확도비교 #csharp세미나
- #csharp #기본값 #definiteassignment #default키워드 #초기화규칙 #구조체초기화 #null값 #csharp세미나
- #csharp #bool #boolean #논리연산자 #부울연산자 #단락평가 #조건문 #csharp기초 #삼항연산자 #csharp세미나
- 테더
- c#
- #csharp #표현식 #배정표현식 #void표현식 #연산자 #산술연산자 #조건연산자 #표현식기초 #csharp세미나
- #csharp #문자열 #문자 #string #char #문자열보간 #문자열연결 #문자열비교 #형식지정자 #문자변환 #csharp세미나
- #csharp #var키워드 #타입추론 #암묵적형식지정 #익명형식 #linq #지역변수 #csharp세미나
- 자동매매
- #csharp #관계연산자 #상등연산자 #equals #비교연산 #null비교 #float비교 #csharp기초 #csharp세미나 #문자열비교
- 빗썸api
- USDT
- #csharp #매개변수 #ref #out #params #명명된인수 #선택적매개변수 #메서드전달 #csharp세미나
- #csharp #비트연산자 #bitwiseoperators #flagsenum #masking #시프트연산 #비트연산 #성능최적화 #csharp세미나 #하드웨어제어
- #csharp #연산자우선순위 #결합성 #operatorprecedence #연산자결합 #오른쪽결합 #왼쪽결합 #csharp세미나
- 파이썬
- 무노동수입
- #csharp #수치형식 #numerictypes #리터럴 #형식추론 #접미사 #decimal #float #double #프로그래미링기조 #그래피포뷰
- c#string
- #csharp #부동소수점 #nan #infinity #특수값 #ieee754 #수치계산 #double #float #decimal #csharp세미나
- #csharp #조건연산자 #삼항연산자 #논리연산자 #단락평가 #ifelse축약 #조건문 #프로그래밍기초 #csharp세미나
- #csharp #배열 #다차원배열 #가변배열 #배열초기화 #indexrange #span #배열비교 #csharp기초 #배열세미나
- c#bool
- #csharp #수치변환 #형식변환 #자동변환 #명시변환 #convert #parse #tryparse #csharp세미나
- #csharp #산술연산자 #arithmeticoperators #기초프로그래밍 #csharp기초 #연산자우선순위 #정수연산 #실수연산 #math클래스 #나눗셈예외 #csharp세미나 #닷넷개발 #프로그래밍입문
- #csharp #널연산자 #nulloperator #널조건부연산자 #널접합연산자 #nullcheck #csharp세미나 #nullsafe #코드안정성
- #csharp #산술오버플로우 #checked #unchecked #overflowexception #정수연산 #오버플로우처리 #csharp세미나 #디버깅 #성능최적화
Archives
- Today
- Total
맛있는 개발노트 (맛과 개발을 함께)
C# 세미나 자료: 특별한 부동소수점 값 (NaN, Infinity, -Infinity, -0) 본문
1. 개요
C#에서 float, double, decimal과 같은 부동소수점 타입은 정수 타입과 달리 **특수한 값(Special Values)**을 가질 수 있습니다. 대표적으로 NaN (Not a Number), Infinity, -Infinity, -0 등이 있으며, 수치 계산의 안정성과 정확성에 큰 영향을 줍니다.
본 세미나에서는 부동소수점의 특별한 값들이 언제 발생하며, 어떤 동작을 하는지, 그리고 실무에서 어떻게 다뤄야 하는지를 초급부터 고급까지 설명합니다.
2. 기본 이론
2.1 NaN (Not a Number)
- 정의되지 않은 계산 결과
- 0을 0으로 나누거나, Math.Sqrt(-1) 등의 연산 시 발생
double nan1 = 0.0 / 0.0;
double nan2 = Math.Sqrt(-1);
Console.WriteLine(double.IsNaN(nan1)); // true
2.2 Infinity / -Infinity
- 아주 큰 수를 넘어서거나, 0으로 나누기 시 발생
double posInf = 1.0 / 0.0; // Infinity
double negInf = -1.0 / 0.0; // -Infinity
Console.WriteLine(double.IsInfinity(posInf)); // true
Console.WriteLine(double.IsPositiveInfinity(posInf)); // true
2.3 -0 (음의 0)
- double이나 float은 +0과 -0을 구분할 수 있음
- 1.0 / -0.0은 -Infinity가 됨
double negZero = -0.0;
Console.WriteLine(1.0 / negZero); // -Infinity
3. 단계별 설명
3.1 초급: NaN과 Infinity 감지
float f = 0f / 0f;
if (float.IsNaN(f))
{
Console.WriteLine("NaN 발생!");
}
float inf = 10f / 0f;
if (float.IsInfinity(inf))
{
Console.WriteLine("Infinity 발생!");
}
3.2 중급: 비교 연산에서의 주의점
double x = double.NaN;
Console.WriteLine(x == double.NaN); // false (항상 false!)
// 올바른 방법:
Console.WriteLine(double.IsNaN(x)); // true
- NaN은 자기 자신과도 같지 않음 (IEEE 754 규칙)
- 비교 대신 IsNaN() 사용 필수
3.3 고급: 계산 전파 및 안정성 확보
double a = Math.Sqrt(-1); // NaN
double b = a + 5; // NaN
Console.WriteLine(b); // NaN
- NaN이 한번 발생하면 대부분의 연산에서 결과도 NaN으로 전파됨
- 수치 알고리즘에서 NaN 또는 Infinity 발생 여부를 중간에 점검해야 함
4. 주의사항 및 팁
- decimal은 NaN, Infinity 등을 지원하지 않음 → 예외 발생
- double.IsNaN(x) 또는 float.IsInfinity(x)로 명확한 확인 필요
- UI 표시 시 "NaN" 또는 "∞"가 출력되므로 사용자에게 오해를 줄 수 있음
- JSON, DB 저장 시 이 값들은 별도 처리 필요
5. 결론
- 특별한 부동소수점 값은 C#의 수치 계산에서 반드시 고려해야 하는 요소
- NaN, Infinity는 계산 오류 또는 특수 상태를 의미하며, 적절한 조건 검사를 통해 제어해야 함
- == 비교가 통하지 않는다는 점을 유의하고, IsNaN, IsInfinity 등 전용 메서드를 사용하세요
6. Q&A
Q1. NaN은 왜 자기 자신과 같지 않나요?
A1. IEEE 754 표준에 따라 NaN은 어떤 수와도 같지 않다고 정의되어 있습니다. 이는 계산 오류의 전파 및 감지를 위해 설계된 동작입니다.
Q2. decimal에는 NaN이 없나요?
A2. 맞습니다. decimal 타입은 고정 소수점 기반이므로 NaN, Infinity 개념이 없고, 오류 시 예외를 던집니다.
Q3. Infinity 값을 비교할 수 있나요?
A3. 네, double.PositiveInfinity와 == 비교가 가능합니다.
Q4. NaN이 포함된 수식을 계속 계산하면 어떻게 되나요?
A4. NaN이 포함되면 결과는 대부분 NaN이 되어 전파됩니다.
'C# 학습 > C# 언어의 기초' 카테고리의 다른 글
C# 세미나 자료: double과 decimal의 차이 (0) | 2025.04.08 |
---|---|
C# 세미나 자료: 문자열과 문자 (String & Char) (0) | 2025.04.07 |
C# 세미나 자료: 비트별 연산자 (Bitwise Operators) (0) | 2025.04.07 |
C# 세미나 자료: 정수 산술 넘침 점검 연산자 (checked / unchecked) (0) | 2025.04.07 |
C# 세미나 자료: 산술 연산자 (Arithmetic Operators) (0) | 2025.04.07 |