REAL NaN 인자와 MAX·MIN 내장 함수

REAL NaN 인자와 MAX·MIN 내장 함수 (MAX and MIN intrinsics with REAL NaN arguments)

인자 중 하나가 NaN일 때 MAXMIN 내장 함수가 무엇을 반환하는지는 표준조차 정해 두지 않았어요. 그래서 gfortran은 더 빠르고 간결한 코드를 만들 수 있도록 결과를 규정하지 않아요. 이 동작을 오해하면 의외의 결과를 만날 수 있어요.

출처: MAX and MIN intrinsics with REAL NaN arguments

본문

Fortran 표준은 MAXMIN 내장 함수의 인자 중 하나가 NaN일 때 그 결과가 무엇이어야 하는지 명시하지 않아요. gfortran도 이를 따라 별도로 규정하지 않아요. 그래서 더 빠르고 컴팩트한 코드가 생성될 수 있어요.

프로그래머가 인자 중 하나가 NaN일 때 특정한 처리를 하고 싶다면, MAXMIN을 호출하기 전에 인자를 명시적으로 검사해야 해요. 이때는 내장 모듈 IEEE_ARITHMETIC 안에 있는 IEEE_IS_NAN 함수를 쓰면 돼요.

! IEEE_IS_NAN으로 NaN 여부를 먼저 확인
use, intrinsic :: ieee_arithmetic
real :: a, b, r
if (.not. ieee_is_nan(a) .and. .not. ieee_is_nan(b)) then
    r = max(a, b)
else
    ! NaN이 섞여 있을 때의 처리를 직접 정의
    ...
end if

핵심은 "결과가 보장되지 않는다"는 의미를 제대로 이해하는 거예요. 어떤 컴파일러는 NaN이 결과로 나올 수도 있고, 어떤 순서에서는 다른 값이 나올 수도 있어요. 그래서 조건 분기 같은 정밀한 로직에서는 MAX/MINNaN을 어떻게 처리할지 기대하면 안 돼요. 수치 계산의 안정성이 중요한 코드라면 IEEE_IS_NAN으로 인자를 걸러 준 다음에 최댓값·최솟값을 구하는 패턴을 쓰는 게 안전해요.

더 알아보기

  • IEEE_ARITHMETIC 내장 모듈과 IEEE_IS_NAN
  • MAX, MIN 내장 함수의 표준 동작
  • gfortran의 컴파일러 특성(Compiler Characteristics) 관련 문서