4

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

doubleの値である8に依存する代わりに、selected_real_kindを使用します。

SnowLeopardを搭載したMacBookProでのgfortran4.6および4.7の出力は次のとおりです。

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

「exp(1.0)」は単精度実数として1を持っているため、e3の値は1とは異なります。

Lionを搭載した新しいMacAirでは、間違った結果が得られます。私はこのマシンで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コンパイラオプションでは、出力を変更します。どのオプションが重要かわかりません。

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

MacAirでは、gfortran4.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からのものです。OSのバージョンとは違うのですか?ライオンではなく、ユキヒョウで動作します。

于 2012-05-20T13:39:38.610 に答える
1

まず、、、およびに変更expしてみてください。dexplogdlog

コンパイラがコード内で一貫して倍精度を強制しなかっただけの問題である場合は、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 に答える