Fortran - 双精度问题

时间:2009-12-12 14:28:24

标签: fortran

我有一个小程序,它从二进制文件中读取一些数据并将其存储到普通(未格式化)文件中。这是来源:

  Program calki2e
  IMPLICIT NONE
!
       DOUBLE PRECISION VAL
      INTEGER P,Q,R,S
    INTEGER  IREC2C
      PARAMETER( IREC2C=15000)
      INTEGER  AND,RSHIFT,LABEL,IMBABS,NX,IB,NFT77
      INTEGER  IND
      DIMENSION IND(IREC2C)
    DOUBLE PRECISION  XP
      DIMENSION XP(IREC2C)
      CHARACTER(LEN=12) :: FN77 = 'input08'
    CONTINUE
    NFT77=77
!----------------------------------------------------------------------
2   CONTINUE
c
    open(unit=NFT77,file=FN77,STATUS='OLD',
     +ACCESS='SEQUENTIAL',FORM='UNFORMATTED')
    open(unit=13,file='calki2e.txt')
    REWIND(77)
4100    continue
     READ(77) NX,IND,XP
       IMBABS=IABS(NX)
       DO 100 IB=1,IMBABS
            LABEL=IND(IB)
            P= AND(RSHIFT(LABEL, 24),255)
            Q= AND(RSHIFT(LABEL, 16),255)
            R= AND(RSHIFT(LABEL,  8),255)
            S= AND(       LABEL     ,255)
            VAL=XP(ib)  
            IF(P.EQ. Q) VAL=VAL+VAL                               
            IF(R .EQ. S)  VAL=VAL+VAL                                    
            IF((P .EQ. R).AND.(Q .EQ. S)) VAL=VAL+VAL 
    write(13,*)P,Q,R,S,val
100 CONTINUE
    IF (NX.GT.0) GOTO 4100
CRB
      CLOSE(UNIT=NFT77)
!
    END

当我使用gfortran编译它时,我在输出文件中获得双精度但是使用g77我只得到单精度。怎么了?怎么改变它?

4 个答案:

答案 0 :(得分:1)

你的意思是“write(13,*)语句。这是”list directed“输出。它是一个方便的I / O,几乎没有规则 - 你得到的将取决于编译器 - 最好使用用于调试和“快速和脏”的程序。为了可靠地获得双精度的所有数字,更改为格式化的输出语句,指定所需的位数。(最好切换到gfortran,因为g77是不再在开发中。)

答案 1 :(得分:0)

您的数字是双精度,但您是以自由格式打印它们。您必须指定显式格式

答案 2 :(得分:0)

我很想将你的write语句中的格式设置为显式,而不是使用* in write(13,*)P,Q,R,S,val

答案 3 :(得分:0)

如果您想保留代码F77,请尝试类似

的内容
      write(13,1000) P,Q,R,S,val
1000  format(1X,4I7,1X,1E14.10)

“1X”表示一个空格,“4I7”表示四个七个宽度的整数,1E14.10表示一个十四个字符宽度的科学表示法实数,有10位有效数字。随意乱搞数字,让它看起来正确。

This是关于该主题的非常好的教程。