Fortran Can Fortran help with data file problem?

AI Thread Summary
The discussion revolves around a Fortran code issue where a user is trying to save numbers between 0 and 1 with increments of 0.01 but encounters inaccuracies, specifically getting 0.314999 instead of 0.315000. The problem is attributed to the use of a small step size (1E-3) instead of the intended 0.01, leading to a large number of iterations that accumulate floating-point errors. Suggestions to resolve the issue include changing the step size to 0.01 and calculating each value of Y independently, rather than incrementing from the previous value. This approach would maintain accuracy by ensuring that each value is computed directly based on its index, thereby reducing the error introduced by repeated addition of a small number. Additionally, it is noted that using real numbers for operations is crucial to minimize inaccuracies in floating-point calculations.
hcelik
Messages
4
Reaction score
0
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>
 

Attachments

  • Ekran Alıntısı.PNG
    Ekran Alıntısı.PNG
    10.8 KB · Views: 555
Technology news on Phys.org
If you want to increment Y by 0.01 each time, why is STEP = 1E-3?
 
hcelik said:
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 !
 
SteamKing said:
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.
 
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:
Y(1) = 0.0
do I = 2,N
Y(I) = Y(I-1) + STEP
end do
write something like
Code:
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:
stallionx said:
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.
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.

Similar threads

Replies
12
Views
3K
Replies
4
Views
2K
Replies
5
Views
5K
Replies
3
Views
2K
Replies
8
Views
2K
Replies
2
Views
2K
Replies
6
Views
2K
Back
Top