Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Fortran: Data file problem

  1. Sep 20, 2011 #1
    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 Files:

  2. jcsd
  3. Sep 20, 2011 #2

    SteamKing

    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper

    If you want to increment Y by 0.01 each time, why is STEP = 1E-3?
     
  4. Sep 20, 2011 #3
    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 !
     
  5. Sep 20, 2011 #4
    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.
     
  6. Sep 20, 2011 #5

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    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
    Code (Text):

    Y(1) = 0.0
    do I = 2,N
    Y(I) = Y(I-1) + STEP
    end do
     
    write something like
    Code (Text):

    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.
     
    Last edited: Sep 20, 2011
  7. Sep 20, 2011 #6

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    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.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook