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