NaNを入力とする時の関数の出力は、規格上の仕様が定まっていないらしくベンダー依存のようです。Intel Fotranの場合、ほとんどの関数はNaNが出力になるようですが、SIGN関数は符号ビットだけをみているようで、NaNから実数へよみがえることができるようです。
追記:ifort は負号と関係なし、gfortran は符号の逆。sign(a, b) の定義は、b の符号に従ってその符号をつけた a を返すというものなので、b が NaN でも a のなにがしかを返すのでしょう。しかし NaN は符号を持たないのでベンダー依存で適当な符号をつけているようです。
±無限大を引数とする場合、ATANは予期する答えを与えてくれるようです。
IEEE745規格にのっとるようになってから、実数ではゼロ割りで憤死!ということが少なくなったわけですが、整数ではまだゼロ割りで憤死します。(当然といえば当然ですが・・・)
プログラム
program test implicit none real, parameter :: pi = 4.0 * atan(1.0) real :: x x = 1.0 / 0.0 print *, 'x =', x, 'atan(x) = ', atan(x) / pi x = 1.0 / -0.0 print *, 'x =', x, 'atan(x) = ', atan(x) / pi print * x = 0.0 / 0.0 print *, 'x =', x, 'sign(1.0, x)=', sign(1.0, x) print * x = 0 / 0 print *, 'x = 0/0 ', x stop end program test
本の出版はまだですが、例題プログラムのページが未完成ながらできているようです。
http://flibs.sourceforge.net/examples_modern_fortran.html