谢谢你的回复。
我还是想再详细解释下我遇到的问题。
这是一个数据文件,文件名叫fil.dat,内容如下。
[Fortran] 纯文本查看 复制代码 0.305999987 0.000000000 0.250000000
0.693999988 0.000000000 0.749999982
0.000000000 0.305999988 0.250000000
0.000000016 0.694000020 0.749999982
0.694000004 0.694000020 0.250000000
0.305999988 0.305999988 0.749999982
0.972666681 0.333333336 0.583333376
0.360666706 0.333333336 0.083333339
0.666666685 0.639333382 0.583333376
0.666666680 0.027333348 0.083333339
0.360666693 0.027333348 0.583333376
0.972666697 0.639333382 0.083333339
0.639333349 0.666666672 0.916666661
0.027333349 0.666666672 0.416666697
0.333333339 0.972666690 0.916666661
0.333333323 0.360666684 0.416666697
0.027333336 0.360666684 0.916666661
0.639333351 0.972666690 0.416666697
0.000000000 0.000000000 0.352000004
0.000000000 0.000000000 0.647999996
-0.000000000 -0.000000000 0.148000006
0.000000000 0.000000000 0.851999967
0.666666668 0.333333336 0.685333361
0.666666668 0.333333336 0.981333354
0.666666668 0.333333336 0.481333318
0.666666668 0.333333336 0.185333251
0.333333336 0.666666672 0.018666744
0.333333336 0.666666672 0.314666675
0.333333336 0.666666672 0.814666675
0.333333336 0.666666672 0.518666682
我想用下面的代码读取这个文件里的数据,并对第3列的数据内容做处理,加上一个常数0.49870538。
[Fortran] 纯文本查看 复制代码 PROGRAM PROCESS
IMPLICIT NONE
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15,14)
INTEGER :: i, j
REAL (KIND=dp) :: coor(30,3)
REAL (KIND=dp) :: inte
OPEN (UNIT=3, FILE='fil.dat', STATUS='OLD')
OPEN (UNIT=4, FILE='processed.dat', STATUS='UNKNOWN')
inte = 0.49870538_dp
DO i = 1, 30, 1
READ (UNIT=3, FMT=*) coor(i,:)
END DO
DO i = 1, 30 ,1
WRITE (UNIT=4, FMT=*) coor(i,1:2), coor(i,3)+inte
END DO
CLOSE (UNIT=3)
CLOSE (UNIT=4)
STOP
END PROGRAM PROCESS
比如,对第一行的第3各数字(0.250000000)加上常数0.49870538,应该得到的数值是0.748705380。但当我运行程序,并将数据输出后,这个数字却是0.74870537999999998。全部的输出数据内容如下。
[Fortran] 纯文本查看 复制代码 0.30599998699999997 0.0000000000000000 0.74870537999999998
0.69399998799999996 0.0000000000000000 1.2487053619999999
0.0000000000000000 0.30599998800000000 0.74870537999999998
1.6000000000000001E-008 0.69400002000000005 1.2487053619999999
0.69400000399999995 0.69400002000000005 0.74870537999999998
0.30599998800000000 0.30599998800000000 1.2487053619999999
0.97266668099999998 0.33333333599999998 1.0820387560000000
0.36066670600000000 0.33333333599999998 0.58203871900000004
0.66666668500000004 0.63933338200000001 1.0820387560000000
0.66666667999999996 2.7333348000000000E-002 0.58203871900000004
0.36066669299999998 2.7333348000000000E-002 1.0820387560000000
0.97266669699999997 0.63933338200000001 0.58203871900000004
0.63933334900000005 0.66666667199999996 1.4153720409999999
2.7333349000000000E-002 0.66666667199999996 0.91537207700000001
0.33333333900000001 0.97266668999999994 1.4153720409999999
0.33333332300000001 0.36066668400000002 0.91537207700000001
2.7333336000000000E-002 0.36066668400000002 1.4153720409999999
0.63933335099999999 0.97266668999999994 0.91537207700000001
0.0000000000000000 0.0000000000000000 0.85070538399999995
0.0000000000000000 0.0000000000000000 1.1467053759999999
-0.0000000000000000 -0.0000000000000000 0.64670538599999994
0.0000000000000000 0.0000000000000000 1.3507053469999999
0.66666666799999996 0.33333333599999998 1.1840387410000000
0.66666666799999996 0.33333333599999998 1.4800387339999999
0.66666666799999996 0.33333333599999998 0.98003869799999999
0.66666666799999996 0.33333333599999998 0.68403863099999995
0.33333333599999998 0.66666667199999996 0.51737212399999999
0.33333333599999998 0.66666667199999996 0.81337205499999998
0.33333333599999998 0.66666667199999996 1.3133720549999999
0.33333333599999998 0.66666667199999996 1.0173720620000000
我知道可以用WRITE命令里的FMT格式,限制输出的数据格式,得到0.748705380。但我不能这么做,因为这只是我中间计算的结果,后期我还要用这个中间计算的结果,做后面的数学处理。也就是说,我想将代码中coor数组里存储的中间数据始终保持0.748705380这类的格式,而不是0.74870537999999998这类格式。
请问要如何做到呢?我的意思是问,要怎样才能保证代码运行过程中的,数组里保存的中间数据永远保持相同的位数格式呢?
能麻烦你再多给我些建议吗?
谢谢啦,盼复。 |