# Fortran: Data file problem

by hcelik
Tags: data, error, fortran
 Share this thread:
 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? 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 Attached Thumbnails
 Emeritus Sci Advisor HW Helper Thanks PF Gold P: 6,258 If you want to increment Y by 0.01 each time, why is STEP = 1E-3?
P: 100
 Quote by hcelik 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? 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
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 !

P: 100
Fortran: Data file problem

 Quote by SteamKing 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.
 Engineering Sci Advisor HW Helper Thanks P: 6,915 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.
Engineering
Sci Advisor
HW Helper
Thanks
P: 6,915
 Quote by stallionx 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.

 Related Discussions Programming & Computer Science 1 Programming & Computer Science 9 Programming & Computer Science 0 Programming & Computer Science 1 Programming & Computer Science 1