fortran66のブログ

fortran について書きます。

NaNから普通の数字に戻れる関数SIGN

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