fortran66のブログ

fortran について書きます。

その他

CP/M-80

(FN) ファイル名は大文字のこと。拡張子はFOR。

cpm.exe f80 (FN), (FN)=(FN)
cpm.exe L80 (FN)/E, (FN)/N
cpm.exe (FN)

C Newton's Method
      PROGRAM SQROOT
      WRITE(*, *) 'input positive real'
      READ(*, *) A
      X = 0.1 * A
      DO 10 I = 1, 10
       X = 0.5 * ( X + A / X )
       WRITE(*, *) I, X, X * X
   10 CONTINUE
      STOP
      END 

CP/M-86

cpm86.exe f77 (fn)
cpm86.exe link86 (fn)
cpm86.exe (fn)

パラメータ文中の負数が0となるバグがある。

C  LOG(1 + x) x [-1/2, 1]
      DOUBLE PRECISION FUNCTION XLOG1(Z) 
      DOUBLE PRECISION Z
      DOUBLE PRECISION X, T
      DOUBLE PRECISION A0, A1, A2, A3, A4
      DOUBLE PRECISION B0, B1, B2, B3
      PARAMETER (A0 = 1.343868263121195503720D-17)
      PARAMETER (A1 = 2.318975937387695797088D+01)
      PARAMETER (A2 =-3.596702770967539323901D+01)
      PARAMETER (A3 = 1.564508745527078514880D+01)
      PARAMETER (A4 =-1.660498419730477197880D+00)
      PARAMETER (B0 = 3.478463906081546474972D+01)
      PARAMETER (B1 =-7.482132500100869683330D+01)
      PARAMETER (B2 = 5.345272372943044723628D+01)
      PARAMETER (B3 =-1.409097943508807212884D+01)
      X = Z / ( Z + 2.0D0 )
      T = X * X
      XLOG1 = (((((A4 * T + A3) * T + A2) * T + A1) * T + A0)
     $      /  ((((     T + B3) * T + B2) * T + B1) * T + B0) - Z) * X
     $      + Z
      RETURN
      END
C=================================================
      PROGRAM TEST
      DOUBLE PRECISION Z, XLOG1
      INTEGER I
      DO 10 I = -5, 10
       Z = I / 10.0
       WRITE(6, *) Z, XLOG1(Z) - LOG(1.0 + Z)
   10 CONTINUE
      STOP
      END
C  LOG(1 + x) x [-1/2, 1]
      DOUBLE PRECISION FUNCTION XLOG1P(Z) 
      DOUBLE PRECISION Z
      DOUBLE PRECISION X, T
      DOUBLE PRECISION A0, A1, A2, A3, A4
      DOUBLE PRECISION B0, B1, B2, B3
      A0 =  1.343868263121195503720D-17
      A1 =  2.318975937387695797088D+01
      A2 = -3.596702770967539323901D+01
      A3 =  1.564508745527078514880D+01
      A4 = -1.660498419730477197880D+00
      B0 =  3.478463906081546474972D+01
      B1 = -7.482132500100869683330D+01
      B2 =  5.345272372943044723628D+01
      B3 = -1.409097943508807212884D+01
      X = Z / ( Z + 2.0D0 )
      T = X * X
      XLOG1P = ( ((((A4 * T + A3) * T + A2) * T + A1) * T + A0) 
     $         / ((((     T + B3) * T + B2) * T + B1) * T + B0) - Z) * X
     $       + Z
      RETURN
      END
C========================================    
      PROGRAM TEST
      INTEGER I
      DOUBLE PRECISION Z, ZZ, XLOG1P
      DO 10 I = 1, 16              
       Z = DBLE(I - 6) * 0.1D0  
       ZZ = XLOG1P(Z)          
       WRITE(6, *) Z, ZZ - LOG(1.0D0 + Z)           
   10 CONTINUE                     
      STOP
      END

MS-DOS

@ECHO OFF
IF EXIST "%1.FOR" GOTO pass1

:pass1
for1 %1 %1 %1 %1
if errorlevel 1 goto exit

:pass2
pas2
if errorlevel 1 goto exit

:link
link %1 /STACK:10000

:exit