我可以用数字调用fortran日志函数吗?

我可以用数字调用fortran日志函数吗?,fortran,gfortran,Fortran,Gfortran,我从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

我从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

更新:

给予

使用选定的\u real\u kind,而不是依赖8作为double的值

在配备雪豹的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
所以这个问题不是唯一的。不知道是什么

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

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。不同的是操作系统版本还是其他什么?对雪豹有效,对狮子无效。

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

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

或者通过输入宏

#define REAL DOUBLE PRECISION

我很确定你一直在叫自然日志。fortran中的Log()本质上是用于自然的。

您的原始代码为我提供了1.0,我在debian6.0系统上运行gfortran w/gcc=4.6.1,当您将
e
更改为
2.7182818284590451D0
和/或
exp(1.0)
时会发生什么?如果我在调试时调用
p(double)Log((double)2.71828)
,我确实得到了1.0。所有
e
e2
e3
的结果都是有意义的,如果你将
e3
定义为
e3=exp(1.0D0)
e3=exp(1.0D0)给出
1.01884..
,我假设你会得到确切的
1.0
<代码>写入(*,*)exp(1.0D0)给出
2.769986…
。两者都有点不合适。请小心使用-fdefault-real-8或的宏版本。它会打碎东西。如果您调用需要实数的库,或者使用具有等价性的旧代码,那么情况就会发生变化,原因也不清楚。最好只记录什么是真实的,什么是双重的。@JonathanDursi确实如此,但在OP的例子中,他/她只是想找出浮点算术异常的原因。这就是为什么我建议他/她首先统一地将所有声明和算术转换为双精度。编译器应该根据其参数的类型选择正确的
LOG
内在。在我看来像是编译器bug,-fdefault-real-8是编译器bug的一个解决方法。而且它在我的Mac Air上不起作用。请看我的答案。谢谢,我尝试了dlog和编译器选项,但没有成功。您是从哪里获得gfortran发行版的?麦克波特。我在使用HPC for Mac OS时有一段非常糟糕的经历。至少以前它将gcc libs放在/usr/local中。Mac OS与该区域的链接以及非系统gcc LIB可能会在系统升级中破坏操作系统。我还有macports版本的gfortran。我会试试看到底是怎么回事。自从我改用lion之后,我也注意到了这个问题。我正在从源代码处重建gcc来做更多的检查。我通过使用gcc(4.5)而不是clang重新编译gmp来解决这个问题。Clang是gmp的默认编译器。使用mpfr中的测试和上面的测试用例,我能够确认这个问题已经解决。
 log(2.7..)   1.3489696    
 log(e)  0.99999994    
 log(e2)  0.99999994    
 log(e3)   1.0188423    
 log(e4)   1.0188423 
 log(2.7..)   1.6249753165355076     
 log(e)   1.0000000000000000     
 log(e2)   1.0000000000000000     
 log(e3)   1.0188422801197137     
 log(e4)   1.0188422801197137
#define REAL DOUBLE PRECISION