4

我从 gfortran 4.5 (OSX) 和 gfortran 4.7 (OSX) 的 log 函数中得到了一些奇怪的结果。

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

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
4

3 回答 3

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 的其他问题。

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

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

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

聚苯乙烯

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。操作系统版本不同还是其他?适用于雪豹,不适用于狮子。

于 2012-05-20T13:39:38.610 回答
1

首先,尝试更改exptodexplogto dlog?

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

或通过放入宏

#define REAL DOUBLE PRECISION
于 2012-05-20T14:00:28.560 回答
-2

我很确定您会继续调用自然对数。fortran 中的 Log() 本质上用于自然。

于 2014-02-14T05:35:56.970 回答