Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran-双精度问题_Fortran - Fatal编程技术网

Fortran-双精度问题

Fortran-双精度问题,fortran,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

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

  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我只获得了单精度。有什么不对以及如何更改?

您的数字是双精度的,但您是以自由格式打印的。您必须指定一种明确的格式

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

我会尝试将write语句上的格式设置为显式格式,而不是在write(13,*)中使用
*p,Q,R,S,val

我会尝试将write语句上的格式设置为显式格式,而不是在write(13,*)p,Q,R,S中使用
*,val

您是指“write(13,*)”语句。这是“列表导向”输出。它是一种方便的I/O,几乎没有规则——您得到的结果将取决于编译器——它最好用于调试和“快速脏”输出“项目。要可靠地获取所有双精度数字,请更改为格式化输出语句,指定所需的位数。(可能最好还是切换到gfortran,因为77国集团已经不再开发了。)

你是说“write(13,*)语句。这是“列表导向”输出。它是一种方便的I/O,规则很少——得到的结果将取决于编译器——它最好用于调试和“快速而肮脏”的输出“项目。要可靠地获取所有双精度数字,请更改为格式化输出语句,指定所需的位数。(可能最好还是换成gfortran,因为77国集团已不再处于开发阶段。)

如果您想保留代码F77,请尝试以下操作

      write(13,1000) P,Q,R,S,val
1000  format(1X,4I7,1X,1E14.10)
“1X”表示一个空格,“4I7”表示四个七宽度的整数,1E14.10表示一个十四字符宽度的科学符号实数和十个有效数字。请随意乱弄数字,让它看起来正确


这是一个很好的教程。

如果您想保留代码F77,请尝试以下方法

      write(13,1000) P,Q,R,S,val
1000  format(1X,4I7,1X,1E14.10)
“1X”表示一个空格,“4I7”表示四个七宽度的整数,1E14.10表示一个十四字符宽度的科学符号实数和十个有效数字。请随意乱弄数字,让它看起来正确


这是一个很好的教程。

在任何人都可以阅读之前,您必须调整代码格式。将代码缩进4个空格以使其正确呈现。您应该更好地格式化您的帖子;对代码使用代码块。我已重新格式化了您的代码。选择代码并使用100按钮执行此操作。在任何人阅读此代码之前,您必须调整代码格式。将代码缩进4个空格以使其正确呈现。您应该更好地格式化您的帖子;对代码使用代码块。我已重新格式化了您的代码。选择代码并使用100按钮执行此操作