Fortran - 双精度问题

发布于 2024-08-14 06:28:48 字数 1345 浏览 3 评论 0原文

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

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

I have a small program that read some data from binary file and stores it into normal (unformatted) files. Here is the source:

  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

When I compile it using gfortran I obtain double precision in output file but with g77 I get only single precision. What it wrong and how to change it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

南城追梦 2024-08-21 06:28:48

您的意思是“write (13, *) 语句吗?这是“列表定向”输出。它是一种方便的 I/O,几乎没有规则——您得到的结果将取决于编译器——它最适合用于调试和“快速而肮脏”的程序。要可靠地获取双精度的所有数字,请更改为格式化输出语句,指定您需要的位数(无论如何,最好切换到 gfortran,因为 g77 不再适用。发展。)

Do you mean the "write (13, *) statement. This is "list directed" output. It is a convenience I/O with few rules -- what you get will depend upon the compiler -- it is best used for debugging and "quick and dirty" programs. To reliably get all the digits of double precision, change to a formatted output statement, specifying the number of digits that you need. (It is probably best to switch to gfortran anyway, as g77 is no longer under development.)

笑饮青盏花 2024-08-21 06:28:48

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

your numbers are double precision but you are printing them in free format. You have to specify an explicit format

夜访吸血鬼 2024-08-21 06:28:48

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

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

“1X”表示 1 个空格,“4I7”表示 4 个七宽度整数,1E14.10 表示 1 个 14 个字符宽度的科学记数法实数,具有 10 个有效数字。请随意修改数字以使其看起来正确。

这是一个关于该主题的非常好的教程。

If you want to keep your code F77, try something like

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

The "1X"s mean one space, "4I7" means four seven-width integers, and 1E14.10 means one fourteen-charater width scientific-notation real number with 10 significant digits. Feel free to mess around with the numbers to get it to look right.

This is a pretty good tutorial on the topic.

地狱即天堂 2024-08-21 06:28:48

我很想将 write 语句上的格式设置为明确的格式,而不是在 write(13,*)P,Q,R,S,val 中使用 * 。

I would be tempted to set the format on your write statement to something explicit, rather than use * in write(13,*)P,Q,R,S,val.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文