2009-12-12 105 views
1

我有一个小程序,它从二进制文件中读取一些数据并将其存储到普通(未格式化)的文件中。这里是来源: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我只得到单精度。它有什么不对?如何改变它?

+0

你将不得不调整你的代码格式,任何人都可以阅读。用4个空格缩进代码以使其正确渲染。 – 2009-12-12 14:31:22

+0

您应该更好地设置您的文章的格式;为您的代码使用代码块。 – 2009-12-12 14:32:20

+0

我已经重新编写了您的代码。选择代码并使用100按钮来执行此操作 – 2009-12-12 14:35:28

回答

0

你的号码是双精度的,但是你以自由格式打印它们。你必须指定一个明确的格式

0

我会试图将你的write语句的格式设置为明确的,而不是使用* in write(13,*)P,Q,R,S,val

1

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

0

如果你想让你的代码F77,尝试像

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

的“1X” S指一个空间,“4I7”表示四个七宽整数,而1E14.10表示十个有效数字的一个十四个宽度的科学符号实数。随意弄乱数字让它看起来不错。

This是一个很不错的主题教程。