2016-11-30 9 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. Я использую компилятор GNU Fortran на компьютере под управлением Windows 10.

+0

Обычно я использую длинные симуляции с участием многих матриц. Матричные умножения, конкатенации, переформатирование, индексирование, БПФ, генерации случайных чисел, MAX, среднее значение, мощности, сложные числа и т. Д. Являются типичными операциями, которые я использую, и я читал, что Modern Fortran с большой поддержкой матричных операций со сверхвысокими скоростями. – AboAmmar

+2

Если вы измените 'real :: s' на 'double precision :: s', вы получите ответ, который вы ожидаете? – francescalus

+0

Ничего себе, это правильно. Но я пробовал много других вещей, таких как 'kind = 16',' real * 16' и т. Д., Но все не сработало, знаете ли вы, почему? – AboAmmar

ответ

1

Ну, в итоге я использовал следующее определение для переменной double precisions. Преимущество этого метода заключается в возможности повторного использования и независимости системы. Спасибо @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 
Смежные вопросы