<aside> 💡 IEEE 754, 부동소수점의 저장 방식을 아신다면 더 쉽게 읽을 수 있습니다.

</aside>

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-infinity는 0이나 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);
}

이 방법 외에도, isinf(f)인 경우 isnan(f - f)도 성립하므로, 이 특성을 활용해도 됩니다.