Can I call the fortran log function with a number?
fortran, gfortran
Solution
program test_log
integer, parameter :: Dbl_K = selected_real_kind (14)
real(Dbl_K) :: e = 2.7182818284590451_Dbl_K
real(Dbl_K) :: e2 = 2.7182818284590451D0
real(Dbl_K) :: e3 = exp(1.0)
real(Dbl_K) :: e4 = exp(1.0_Dbl_K)
write(*,*) 'log(2.7..)', log(2.7182818284590451_Dbl_K)
write(*,*) 'log(e)', log(e)
write(*,*) 'log(e2)', log(e2)
write(*,*) 'log(e3)', log(e3)
write(*,*) 'log(e4)', log(e4)
end program test_log
Uses selected_real_kind instead of relying on 8 being the value for double.
Output with gfortran 4.6 and 4.7 on a MacBook Pro with Snow Leopard is:
log(2.7..) 1.0000000000000000
log(e) 1.0000000000000000
log(e2) 1.0000000000000000
log(e3) 0.99999996963214000
log(e4) 1.0000000000000000
The value for e3 is different from 1 because "exp(1.0)" has 1 as a single precision real.
On my new Mac Air with Lion I get incorrect results. I have observed other problems gfortran on this machine.
gfortran 4.6
log(2.7..) 1.6249753165355076
log(e) 1.6249753165355076
log(e2) 1.6249753165355076
log(e3) 1.6438056251294211
log(e4) 1.6438055841322456
gfortran 4.7
log(2.7..) 1.6249753165355076
log(e) 1.0000000000000000
log(e2) 1.0000000000000000
log(e3) 1.0188423211430429
log(e4) 1.0188422801197137
So the problem isn't unique. Not sure what it is.
P.S. On the MacAir compiler options change the output. I'm not sure which option or options matter.
P.P.S.
program test2_log
real:: e = 2.7182818284590451
real:: e2 = 2.7182818284590451D0
real:: e3 = exp(1.0)
real:: e4 = exp(1.0)
write(*,*) 'log(2.7..)', log(2.7182818284590451)
write(*,*) 'log(e)', log(e)
write(*,*) 'log(e2)', log(e2)
write(*,*) 'log(e3)', log(e3)
write(*,*) 'log(e4)', log(e4)
end program test2_log
On the MacAir, gfortran 4.6 gives:
log(2.7..) 1.3489696
log(e) 0.99999994
log(e2) 0.99999994
log(e3) 1.0188423
log(e4) 1.0188423
with the compiler option -fdefault-real-8 it changes to
log(2.7..) 1.6249753165355076
log(e) 1.0000000000000000
log(e2) 1.0000000000000000
log(e3) 1.0188422801197137
log(e4) 1.0188422801197137
It's some defect in the installation.
Edit: all gfortran versions on both machines are from MacPorts. Is the different the OS version or something else? Works on Snow Leopard, not on Lion.
Problem
I'm getting some strange results from the log function in gfortran 4.5 (OSX) and gfortran 4.7 (OSX). The following program gives the unexpected results: ``` program test_log real(8) :: e = 2.7182818284590451_8 write(*,*) 'log(2.7..)', log(2.7182818284590451_8) write(*,*) 'log(e)', log(e) end program test_log ``` I run it like this: ``` gfortran-mp-4.5 ./test.f90 && ./a.out log(2.7..) 1.6249753165355076 log(e) 1.0000000000000000 ``` I expected both to be 1.0 Update: ``` program test_log real(8) :: e = 2.7182818284590451_8 real(8) :: e2 = 2.7182818284590451D0 real(8) :: e3 = exp(1.0) write(*,*) 'log(2.7..)', log(2.7182818284590451_8) write(*,*) 'log(e)', log(e) write(*,*) 'log(e2)', log(e2) write(*,*) 'log(e3)', log(e3) end program test_log ``` gives ``` gfortran-mp-4.5 ./test.f90 && ./a.out log(2.7..) 1.6249753165355076 log(e) 1.0000000000000000 log(e2) 1.0000000000000000 log(e3) 1.0188423211430429 ```