1. 소수부 손실 (데이터 손실)
가장 기본적인 문제는 소수부가 완전히 손실되어 int로 변환할 때 소수부는 버려짐
float f = 3.9f;
int i = (int)f; // i는 3이 됩니다 (4가 아님)
2. 오버플로우 발생 가능성
float는 최대 35억이므로 32비트 int(21억)보다 더 큰 범위의 값을 표현할 수 있기 때문에 오버플로우 발생 가능
float f = 3.5e9f; // 35억
int i = (int)f; // 오버플로우 발생 (대부분의 32비트 시스템에서)
3. 특수값 처리 문제
IEEE 754 표준에 따른 부동소수점에는 NaN(Not a Number), 무한대(Infinity) 등의 특수값 int로 변환하려고 하면 미정의 동작(undefined behavior)이 발생할 수 있음
4. 부동소수점 표현의 부정확성
부동소수점은 이진 표현의 한계로 인해 일부 십진 소수를 정확히 표현할 수 없어 오차 발생 가능
컴퓨터구조 컴퓨터가 이해하는 정보
CPU는 0과 1만 이해할 수 있음비트는 0과 1을 나타내는 가장 작은 단위워드는 CPU가 한 번에 처리할 수 있는 데이터의 크기, 보통 32/64 bit 부동 소수점c == a + b가 false가 될 수 있는 이유는 부동 소수
eovywjr1.tistory.com
float f2 = 0.1f + 0.2f + 0.7f; // 이론상 1.0이지만 실제로는 0.9999...
int i2 = (int)f2; // 0이 될 수 있음 (1.0이 되어야 할 상황에서)
실수 연산할 때의 오차 해결 방법
1. 고정소수점 연산
고정소수점 방식은 소수점 위치를 고정하고 정수로 계산
정확한 소수점 자리수를 보장하지만 표현 범위가 제한됨
int value = static_cast<int>(3.14 * 100); // 314 저장
double result = value / 100.0; // 필요할 때 3.14로 변환
2. 언리얼 FMath 라이브러리와 허용 오차(Epsilon) 기반 비교
if (FMath::IsNearlyEqual(A, B)) // 기본 KINDA_SMALL_NUMBER 사용
if (FMath::IsNearlyEqual(A, B, CustomTolerance))
if (FMath::IsNearlyZero(Value)) // UE_SMALL_NUMBER 사용, 값이 0에 가까운지 확인
'C++' 카테고리의 다른 글
C++ 얕은 복사 vs 깊은 복사 (0) | 2025.03.25 |
---|---|
C++ 가상 함수의 비용 (0) | 2025.02.26 |
c++ volatile (1) | 2024.12.03 |
C++ 람다 (1) | 2024.11.15 |
C++ 구조체, 클래스의 패딩 바이트 (0) | 2024.10.11 |