我可以使用数字调用fortran日志功能吗?

时间:2012-05-20 13:10:40

标签: fortran gfortran

我从gfortran 4.5(OSX)和gfortran 4.7(OSX)的日志功能中得到了一些奇怪的结果。

以下程序给出了意想不到的结果:

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

我这样运行:

gfortran-mp-4.5 ./test.f90  && ./a.out 
log(2.7..)   1.6249753165355076     
log(e)   1.0000000000000000

我预计两者都是1.0

更新

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

给出

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

3 个答案:

答案 0 :(得分:7)

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

使用selected_real_kind而不是依赖8作为double的值。

在带有Snow Leopard的MacBook Pro上使用gfortran 4.6和4.7输出:

 log(2.7..)   1.0000000000000000     
 log(e)   1.0000000000000000     
 log(e2)   1.0000000000000000     
 log(e3)  0.99999996963214000     
 log(e4)   1.0000000000000000 

e3的值不同于1,因为“exp(1.0)”将1作为单精度实数。

在我使用Lion的新Mac Air上,我的结果不正确。我在这台机器上观察到了其他问题。

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

所以这个问题不是唯一的。不确定它是什么。

P.S。在MacAir编译器选项上更改输出。我不确定哪个选项或选项很重要。

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

在MacAir上,gfortran 4.6给出了:

 log(2.7..)   1.3489696    
 log(e)  0.99999994    
 log(e2)  0.99999994    
 log(e3)   1.0188423    
 log(e4)   1.0188423 

使用编译器选项-fdefault-real-8将其更改为

 log(2.7..)   1.6249753165355076     
 log(e)   1.0000000000000000     
 log(e2)   1.0000000000000000     
 log(e3)   1.0188422801197137     
 log(e4)   1.0188422801197137

这是安装中的一些缺陷。

编辑:两台机器上的所有gfortran版本都来自MacPorts。操作系统版本或其他是不同的?适用于雪豹,而不是狮子。

答案 1 :(得分:1)

首先,尝试将exp更改为dexp,将log更改为dlog

如果只是编译器的问题没有在代码中一致地强制双精度,那么尝试强制双精度作为gfortran中的编译器标志:gfortran -fdefault-real-8 foo.f90

或通过放入宏

#define REAL DOUBLE PRECISION

答案 2 :(得分:-2)

我很确定你继续只是调用自然日志。 fortran中的Log()本质上用于自然。