fortran66のブログ

fortran について書きます。

INT(NaN), INT(+inf), INT(-inf) および部分配列ははみ出しおk?

IEEE例外の数に対するINT()の定義がよくわかりません。文献等で見た記憶がありません。後でISOの規格を調べてみたいですが、面倒くさくて億劫だw INTEGERのOut of rangeは、負の絶対値最大数になっているようですが、Intelの独自実装なのでしょうか、ISOの規定なのでしょうか?

ソースコード

PROGRAM memo
   IMPLICIT NONE
   INTEGER :: i
   REAL :: x
   
   ! NaN
   x = 0.0 / 0.0
   PRINT '(F10.10)', x
   PRINT '(B32.32)'   , x
   i = INT(x)
   PRINT '(a, i11)', 'INT(x) =', i
   PRINT '(B32.32/)', i
   ! +Inf
   x = +1.0 / 0.0
   PRINT '(F10.10)', x
   PRINT '(B32.32)'   , x
   i = INT(x)
   PRINT '(a, i11)', 'INT(x) =', i
   PRINT '(B32.32/)', i
   ! -Inf
   x = -1.0 / 0.0
   PRINT '(F10.10)', x
   PRINT '(B32.32)'   , x
   i = INT(x)
   PRINT '(a, i11)', 'INT(x) =', i
   PRINT '(B32.32/)', i
   !
 
   STOP
END PROGRAM memo

■実行結果

部分配列は、配列宣言の範囲をはみ出しても怒られないようです。また、ありえない範囲を指定すると適当にSIZE 0の空配列や0で埋まった配列を生成してくれるようです。部分配列のはみ出し時の振る舞いも、文献等で見た記憶が無いです。再帰で配列を短くしてゆく処理をする分には便利です。

ソースコード

PROGRAM memo2
  IMPLICIT NONE
  INTEGER :: m(3) = [1, 2, 3]
  
  CALL test( m(1:) )
  CALL test( m(2:) )
  CALL test( m(3:) )
  CALL test( m(4:) )
  CALL test( m(4:6) )

  STOP
  
 CONTAINS
 
  RECURSIVE SUBROUTINE test(n)
    INTEGER, INTENT(IN) :: n(:)
    
    IF (SIZE(n) == 0) THEN
     PRINT *, 'NULL!' 
    ELSE 
     PRINT *, n
     CALL test(n(2:))
    END IF
    
    RETURN
  END SUBROUTINE test 
  
END PROGRAM memo2

■実行結果