【问题标题】:Format in the READ statement and real number roundingREAD 语句中的格式和实数舍入
【发布时间】:2016-11-24 16:33:43
【问题描述】:

我正在尝试使用 FORTRAN 77 中的格式语句来精确定义我想要读取的数字。

这是我的代码行:

double precision x,y,z   
open(u,FILE='points.dat',STATUS='OLD')    
do 10 i=1,n    
read(u,100) x,y,z    
write(*,*),'check', x,y,z    
enddo   
100 format(3(2x,D14.2))     
close(u)

我尝试读取这些数字:1.0542095e-03 -3.4176819e-02 -1.3796906e-01 使用不同的格式,结果是:

format(3(2x,E14.2)):  check  0.0010542095 -0.034176819 -0.13796906    
format(3(2x,E14.7)):  check  0.0010542095 -0.034176819 -0.13796906     
format(3(2x,D14.7)):  check  0.0010542095 -0.034176819 -0.13796906    

我本来希望第一行给出 0.001000000,第二行给出 0.001054209,但格式语句似乎对阅读没有影响,或者我没有正确使用它。任何人都可以解释一下格式在读取功能中的作用以及如何正确使用它?

【问题讨论】:

  • 这个问题可能有两个部分。主要的答案是读取正在做它应该做的事情(当你在输入值中有一个小数符号时,格式中小数部分的宽度被忽略)。这导致:您是否还想要一个答案,告诉您必须将正确读取的实际值的值截断到给定的小数位数?

标签: format fortran


【解决方案1】:

阅读时不要使用编辑描述符的.2 部分。绝不。它做了非常糟糕和令人困惑的事情。总是放在那里.0

它实际上做的是当读取的数字包含小数点时它什么都不做。到目前为止还不错。但是如果数字不包含小数点,它会根据你的数字加一个。

所以如果你阅读

'1'

使用

read '(E10.2)', x

x 将变为 0.01

如果你用相同的方式读取'1.0',它会变成1.0

我强烈建议在任何情况下都在真正的编辑描述符中使用.0


例如,为了对数字进行四舍五入,您可以这样做

read '(E10.0)', x
x = aint(x*100)/100

【讨论】:

  • 你能评论一下它为什么会这样吗? “读取”功能如何工作,从而忽略“.2”部分?这不是不受欢迎的行为吗?或者也许链接到它的参考,我见过的大多数在线参考都没有解释阅读格式的预期用途。
  • @rmhleo 这是一个非常复杂的话题。你必须学习一些教科书的整章。 fortran.com/F77_std/rjcnf0001-sh-13.html 在某些情况下您确实想要这种行为,但并不常见。
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多