2016-11-30 24 views
0

私は、Fortranに新たなんだので、私は次のコードで愚かな何かをやっている場合は、私を許し:Fortranプログラムが間違った出力をしていますか?

program test2 
    implicit none 

    ! Variable declaration 
    integer :: i, n 
    real :: s 

    ! Initialization 
    n = 1e+9 
    s = 0.0 

    do i=1,n 
     s = s + real(i) 
     s = s + sqrt(s) 
    end do 

    print *, s 

end program test2 

この小さなプログラムの出力は:1.8014399E+16と私はそれが1.0000000010000024E+18を与えることを期待しています。私はWindows 10マシンでGNU Fortranコンパイラを使用します。

+0

私は通常、多くの行列を含む長いシミュレーションを実行します。モダン・フォートランは、超高速での行列演算を強力にサポートしていることを私は読んでいますが、モトローラの乗算、連結、再整形、インデックス作成、FFT、乱数生成、MAX、平均、べき乗、複素数などは私が使用する典型的な演算です。 – AboAmmar

+2

'real :: s'を 'double precision :: s'に変更すると、あなたが期待する答えが得られますか? – francescalus

+0

うわー、そうです。しかし、私は 'kind = 16'、' real * 16'など多くのことを試しましたが、すべて動作しませんでした。 – AboAmmar

答えて

1

まあ、double precision変数sの定義は次のとおりです。この方法には、再利用可能でシステムに依存しないという利点があります。コメントのために@francescalusに感謝します。

program test2 
    implicit none 

    ! Variable declaration 
    integer, parameter :: dp = kind(0.d0) 
    integer :: i, n 
    real(dp) :: s 

    ! Initialization 
    n = 1e+9 
    s = 0.0 

    do i=1,n 
     s = s + real(i) 
     s = s + sqrt(s) 
    end do 

    print *, s 

end program test2 
関連する問題