Search
Duplicate
💥

[토막글] isnan, isinf 구현하기

간단소개
NaN과 infinity 판별하기
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
C++
Scrap
태그
IEEE 754
9 more properties

isnan, isinf

isnan은 인자가 NaN일 때, isinf는 인자가 infinity-infinity일 때 참을 반환합니다.

NaN, infinity

NaNnot a number의 약자로, 숫자가 아닌 비정상적인 값을 나타냅니다.
infinity는 무한히 큰 값을 나타내는데, 무한히 작은 값을 나타내는 -infinity도 있습니다.

비트 연산을 사용한 구현

지수부 비트가 모두 켜져 있으며 가수부 비트가 모두 꺼져 있다면 infinity (또는 -ininity),
그리고 지수부 비트가 모두 켜져 있으며 가수부 비트 중 하나라도 켜져 있다면 NaN입니다.
비트연산을 사용한 isnan 구현 예시, long double에 대해서는 불가능
그 점을 이용하면 지수부 비트와 가수부 비트로 isnan, isinf를 구현할 수 있습니다.
단, floatdouble에 대해서요. long double에 대해서는 구현할 수 없습니다.

long double은 안 될까?

이유는 간단합니다. 지수부와 가수부가 어디까지인지 알 수 없기 때문입니다.
long double의 크기는 80비트일 수도, 128비트일 수도, 둘 다 아닐 수도 있습니다.
long double의 크기는 sizeof로 알아낼 수 있지만, 어디까지가 지수부일지는 글쎄요…

NaNinfinity의 특성을 활용한 구현

NaN은 무엇과 비교해도 같지 않습니다. 심지어 NaN == NaN조차 false입니다.
infinity-infinity0이나 infinity를 제외하고 무엇을 곱해도 부호만 바뀝니다.
f는, f != f이면 NaN이고, f * 2 == f이면 0, infinity, -infinity 중 하나입니다.
bool isnan_float(float f) { return (f != f); } bool isinf_float(float f) { return (f != 0 && f * 2 == f); }
C
복사
float에 대한 isnan. isinf 구현 예시
이 방법 외에도, isinf(f)인 경우 isnan(f - f)도 성립하므로, 이 특성을 활용해도 됩니다.