isnan, isinf
isnan은 인자가 NaN일 때, isinf는 인자가 infinity나 -infinity일 때 참을 반환합니다.
NaN, infinity
NaN은 not a number의 약자로, 숫자가 아닌 비정상적인 값을 나타냅니다.
infinity는 무한히 큰 값을 나타내는데, 무한히 작은 값을 나타내는 -infinity도 있습니다.
비트 연산을 사용한 구현
지수부 비트가 모두 켜져 있으며 가수부 비트가 모두 꺼져 있다면 infinity (또는 -ininity),
그리고 지수부 비트가 모두 켜져 있으며 가수부 비트 중 하나라도 켜져 있다면 NaN입니다.
비트연산을 사용한 isnan 구현 예시, long double에 대해서는 불가능
그 점을 이용하면 지수부 비트와 가수부 비트로 isnan, isinf를 구현할 수 있습니다.
단, float과 double에 대해서요. long double에 대해서는 구현할 수 없습니다.
왜 long double은 안 될까?
이유는 간단합니다. 지수부와 가수부가 어디까지인지 알 수 없기 때문입니다.
long double의 크기는 80비트일 수도, 128비트일 수도, 둘 다 아닐 수도 있습니다.
long double의 크기는 sizeof로 알아낼 수 있지만, 어디까지가 지수부일지는 글쎄요…
NaN과 infinity의 특성을 활용한 구현
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);
}
C
복사
float에 대한 isnan. isinf 구현 예시
이 방법 외에도, isinf(f)인 경우 isnan(f - f)도 성립하므로, 이 특성을 활용해도 됩니다.