我从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
Run Code Online (Sandbox Code Playgroud)
我像这样运行它:
gfortran-mp-4.5 ./test.f90 && ./a.out
log(2.7..) 1.6249753165355076
log(e) 1.0000000000000000
Run Code Online (Sandbox Code Playgroud)
我预计两者都是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
Run Code Online (Sandbox Code Playgroud)
给
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
gfortran 4.7
log(2.7..) 1.6249753165355076
log(e) 1.0000000000000000
log(e2) 1.0000000000000000
log(e3) 1.0188423211430429
log(e4) 1.0188422801197137
Run Code Online (Sandbox Code Playgroud)
所以这个问题不是唯一的.不确定它是什么.
PS在MacAir编译器选项上更改输出.我不确定哪个选项或选项很重要.
PPS
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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
使用编译器选项-fdefault-real-8,它将更改为
log(2.7..) 1.6249753165355076
log(e) 1.0000000000000000
log(e2) 1.0000000000000000
log(e3) 1.0188422801197137
log(e4) 1.0188422801197137
Run Code Online (Sandbox Code Playgroud)
这是安装中的一些缺陷.
编辑:两台机器上的所有gfortran版本都来自MacPorts.操作系统版本或其他是不同的?适用于雪豹,而非狮子.