Fortran: Data file problem


by hcelik
Tags: data, error, fortran
hcelik
hcelik is offline
#1
Sep20-11, 06:58 AM
P: 4
Hello guys. I want to save the numbers between 0 and 1 with 0.01 increasement to a dat file. I wrote a code for this using Fortran however, after a point I get 0.314999 instead of 0.315000. Can you help me to solve my problem?


<code>
REAL, DIMENSION(:), ALLOCATABLE :: Y
REAL STEP, JEND, PX, GR, RE, RATIO
INTEGER N, I, J
JEND = 1.00
STEP = 1E-3
N = JEND/STEP+1
RE=1
GR=1
RATIO=GR/RE
PX=-12.00
ALLOCATE (Y(N))
Y(1) = 0.0
OPEN(UNIT=8, FILE='HEATLINE.DAT', STATUS='OLD', FORM='FORMATTED')
DO I = 2, N
Y(I) = Y(I-1)+STEP
END DO
PRINT *, 'N IS:' , N
PRINT *, 'I IS:',I
53 format('VARIABLES = "Y"')

WRITE(8,53)

do i=1,n
write(8,*) Y(I)
end do

CLOSE(8)
END



</code>
Attached Thumbnails
Ekran Alıntısı.PNG  
Phys.Org News Partner Science news on Phys.org
Going nuts? Turkey looks to pistachios to heat new eco-city
Space-tested fluid flow concept advances infectious disease diagnoses
SpaceX launches supplies to space station (Update)
SteamKing
SteamKing is offline
#2
Sep20-11, 09:15 AM
HW Helper
Thanks
P: 5,542
If you want to increment Y by 0.01 each time, why is STEP = 1E-3?
stallionx
stallionx is offline
#3
Sep20-11, 09:20 AM
P: 100
Quote Quote by hcelik View Post
Hello guys. I want to save the numbers between 0 and 1 with 0.01 increasement to a dat file. I wrote a code for this using Fortran however, after a point I get 0.314999 instead of 0.315000. Can you help me to solve my problem?


<code>
REAL, DIMENSION(:), ALLOCATABLE :: Y
REAL STEP, JEND, PX, GR, RE, RATIO
INTEGER N, I, J
JEND = 1.00
STEP = 1E-3
N = JEND/STEP+1
RE=1
GR=1
RATIO=GR/RE
PX=-12.00
ALLOCATE (Y(N))
Y(1) = 0.0
OPEN(UNIT=8, FILE='HEATLINE.DAT', STATUS='OLD', FORM='FORMATTED')
DO I = 2, N
Y(I) = Y(I-1)+STEP
END DO
PRINT *, 'N IS:' , N
PRINT *, 'I IS:',I
53 format('VARIABLES = "Y"')

WRITE(8,53)

do i=1,n
write(8,*) Y(I)
end do

CLOSE(8)
END



</code>
I humbly suggest that you do all divisions, multiplications , operations with real values when you are dealing with real numbers.

i.e: if RE is a real and you want to declare it

try RE=(1.0) instead of RE=1 ( 1 is an integer so may affect the operation )

Use real numbers when dealing with real numbers, I can humbly suggest.

Good Luck !

stallionx
stallionx is offline
#4
Sep20-11, 11:11 AM
P: 100

Fortran: Data file problem


Quote Quote by SteamKing View Post
If you want to increment Y by 0.01 each time, why is STEP = 1E-3?
And yes beides you should set STEP=1.*(10.)**-2 for 0.01 increments, else it will increment by 0.001 and print out 1001 values, where it should make 101 values.
AlephZero
AlephZero is offline
#5
Sep20-11, 02:42 PM
Engineering
Sci Advisor
HW Helper
Thanks
P: 6,344
I assume you already know that floating point values stored in real variables are almost never exact. If you set STEP = 1E-3, the value will not be exactly 0.001, though it should be accurate to about 6 or 7 significant figures.

The problem with your code is that you are adding STEP to itself a very large number of times, so these small errors accumulate.

If you add STEP to itself 10 times, instead of 6 or 7 signifincat digits of accuracy you will only have about 5 or 6 digits. If you add it to itself 100 times, the accuracy reduces to 4 or 5 digits. For 1000 times, 3 or 4 digits, etc.

The best way to avoid this problem is to calculate each value of Y independently of the others. Instead of
Y(1) = 0.0
do I = 2,N
Y(I) = Y(I-1) + STEP
end do
write something like
do i = 1,n
Y(i) = (i-1)*STEP
enddo
Then every entry in the Y array will be as accurate (6 or 7 significant figures) as the value of STEP.
AlephZero
AlephZero is offline
#6
Sep20-11, 02:49 PM
Engineering
Sci Advisor
HW Helper
Thanks
P: 6,344
Quote Quote by stallionx View Post
Itry RE=(1.0) instead of RE=1
That will make no difference. Integer constants (at least if they have less than about 6 decimal digits) are converted to reals exactly. That certainly applies to constants like 0 and 1. The paretheses ( ) don't have any purpose here either.


Register to reply

Related Discussions
Fortran: Read data from a line in a file Programming & Computer Science 1
Fortran 90, problem with reading a file Programming & Computer Science 9
using a batch file to create NAMELIST input file for FORTRAN Programming & Computer Science 0
Fortran locate symbol in data file Programming & Computer Science 1
Find peak in the historgram data file... - FORTRAN! Programming & Computer Science 1