! 例題 8-4 偏差値と順位 [関数名が引数になる場合 ] PROGRAM ex8_4 IMPLICIT NONE REAL :: h, phix, err REAL, EXTERNAL :: gaussian ! 外部関数宣言 PRINT *, 'あなたの偏差値は?' READ *, h h = ( h - 50.0E0 ) / 10.0E0 ! 標準の正規分布に換算 CALL simpson( gaussian, 0.0E0, h, 16, phix ) err = ( 0.5E0 - phix ) * 100.0E0 PRINT '( 1X, A, F6.2, A )', '上位から', err, ' %です。' END PROGRAM ex8_4 ! シンプソン公式 SUBROUTINE simpson( func, a, b, kubun, integ ) IMPLICIT NONE INTEGER, INTENT( IN ) :: kubun ! 区分数はこれの2倍 INTEGER :: i REAL, EXTERNAL :: func ! INTENT 不要 REAL, INTENT ( IN ) :: a, b REAL, INTENT ( OUT ) :: integ REAL :: x, dx dx = ( b - a ) / ( 2.0E0 * kubun ) integ = func( a ) + 4.0E0 * func( a + dx ) + func( b ) DO i = 1, kubun - 1 x = a + ( 2.0E0 * i ) * dx integ = integ + 2.0E0 * func( x ) + 4.0E0 * func( x + dx ) END DO integ = integ * dx / 3.0E0 END SUBROUTINE simpson REAL FUNCTION gaussian( s ) IMPLICIT NONE REAL, PARAMETER :: rn = 2.506628E0 ! SQRT( 2 * pi ) REAL, INTENT( IN ) :: s gaussian = EXP( - s * s / 2.0E0 ) / rn END FUNCTION gaussian