いくつか検索した結果、Fortran 2003 とiso_c_binding
組み込みモジュールを使用すると、これが可能であり、非常に簡単であることがわかりました。これをここに文書化する必要があると思いました。属性を持つインターフェースはbind
引き続き.pure
elemental
isnan
以下は、引数が NaN の場合にゼロ以外の整数値を返すC99 マクロの短い例です。もちろん、これは、副作用のないユーザー定義の C/C++ 関数に対しても実行できます。
elemental function isnan(val)
use, intrinsic :: iso_c_binding
implicit none
real(c_double), intent(in) :: val
logical(c_bool) :: isnan
interface
pure function isnan_C(val) bind(C, name = 'isnan')
import
! Pass the parameter by value:
real(c_double), value, intent(in) :: val
integer(c_int) :: isnan_C
end function
end interface
isnan = isnan_C(val) /= 0_c_int
end function
いくつかの NaN 値を持つ配列を使用した出力例:
program main
use, intrinsic :: iso_c_binding
implicit none
real(c_double) :: nan(2,2) = 0.
nan(:,2) = nan(1,1)/0.
write(*,'(4F6.2 / 4L6)') nan, isnan(nan) ! Output: 0.00 0.00 NaN NaN
! F F T T
end program