# A strange fortran code

by phynewb
Tags: code, fortran, strange
 P: 13 Hi guys, I just wrote a simple code for delta function and print it out. Here it is. program main implicit none integer i real*8 del real*8,parameter:: ep=1D-2 real*8,parameter:: pi=3.1415926 do i=-10,10,1 write(*,*) i,del(real(i)) ! use function enddo do i=-10,10,1 write(*,*) i,(1.0/pi*ep/((real(i))**2+ep**2)) ! no use function enddo end function del(x) implicit none real*8 del real*8 x real*8,parameter::ep=1D-2 real*8,parameter:: pi=3.1415926 del=(1.0/pi*ep/(x**2+ep**2)) return end It turns out to be quite wrong by using function del. I cannot figure out what's wrong with the function because the expression is the same. Can you tell me how to debug the function? Thanks!
Mentor
P: 19,860
 Quote by phynewb Hi guys, I just wrote a simple code for delta function and print it out. Here it is. program main implicit none integer i real*8 del real*8,parameter:: ep=1D-2 real*8,parameter:: pi=3.1415926 do i=-10,10,1 write(*,*) i,del(real(i)) ! use function enddo do i=-10,10,1 write(*,*) i,(1.0/pi*ep/((real(i))**2+ep**2)) ! no use function enddo end function del(x) implicit none real*8 del real*8 x real*8,parameter::ep=1D-2 real*8,parameter:: pi=3.1415926 del=(1.0/pi*ep/(x**2+ep**2)) return end It turns out to be quite wrong by using function del. I cannot figure out what's wrong with the function because the expression is the same. Can you tell me how to debug the function? Thanks!
What output do your two loops produce?
P: 13
 Quote by Mark44 What output do your two loops produce?
It shows
-10 31.830990148286446
-9 4.42379935910539249E-054
-8 3.96072696157977595E-306
-7 31.830990148286446
-6 4.42379936653263965E-054
-5 0.0000000000000000
-4 31.830990148286446
-3 4.42379937841623373E-054
-2 0.0000000000000000
-1 31.830990148286446
0 4.42380394766179441E-054
1 31.830990148286446
2 4.42380242655975552E-054
3 31.830990148286446
4 4.42380241467614869E-054
5 31.830990148286446
6 4.42380240873434528E-054
7 31.830990148286446
8 4.42380240279254245E-054
9 31.830990148286446
10 4.42380239982164045E-054

-10 3.18309583173281331E-005
-9 3.92974701861929112E-005
-8 4.97358443944407051E-005
-7 6.49610718106421125E-005
-6 8.84191714697638248E-005
-5 1.27323451299340604E-004
-4 1.98942445036508832E-004
-3 3.53673738606087140E-004
-2 7.95754859835665312E-004
-1 3.18278073675496917E-003
0 31.830990148286446
1 3.18278073675496917E-003
2 7.95754859835665312E-004
3 3.53673738606087140E-004
4 1.98942445036508832E-004
5 1.27323451299340604E-004
6 8.84191714697638248E-005
7 6.49610718106421125E-005
8 4.97358443944407051E-005
9 3.92974701861929112E-005
10 3.18309583173281331E-005

The upper part is from the function and the lower part is calculated without function. It shall look like sharp gaussian distribution around 0 instead of random distribution.

Mentor
P: 19,860

## A strange fortran code

I'm pretty sure this line is causing the problem:
write(*,*) i,del(real(i))  ! use function
In the call to your del function, you are converting an integer value, i, to a four-byte real (a single-precision floating point value), but the function is expecting an eight-byte real (a double-precision floating point value).

I think this will fix the problem:
write(*,*) i,del(dble(i))  ! use function