program main
call findbracket(x0, a, b)
end program
function f(x)
double precision x,f
f = x
end function
subroutine findbracket(x0,a,b)
double precision x0, a, b
double precision fa, fb
double precision dx
dx = 0.001d0
x0 = 1.0d0
a = x0
b = x0
print*, a, b
print*, f(a)
print*, f(b)
do
fa = f(a)
fb = f(b)
print*, "what is fa", fa
print*, "what is fb", fb
a = a - dx
if (fa*fb < 0) then
exit
end if
print*, b, dx
b = b + dx
if (fa*fb < 0) then
exit
end if
dx = dx*2
end do
end subroutine
Я пишу программу, которая решает корень данной функции f (x). На этом этапе я просто хочу проверить, не получаю ли я правильное значение для каждого шага, и я заметил некоторые ошибки. Чтобы сделать его простым, у меня есть функция f (x) = x, и я ожидал, что программа будет печатать f (a) = 1.0 и f (b) = 1.0, но выход будет f (a) = 1,8750000000000000 и f (b) = 0,0000000000000000. Плюс, хотя я устанавливаю как a, так и b равным x0, он выглядит как a = 1.0000002381857485 и b = 1.0000000000000000. Может ли кто-нибудь объяснить, почему это происходит? Возможно, мне не хватает чего-то глупого, но я не могу найти его. Я ценю вашу помощь.Fortran 90 странное поведение
Заменить строку 'end program' на строку, содержащую слово' contains'. В конце исходного файла, содержащего весь ваш код, добавьте строку 'end program'. Затем сразу же после начала строки 'program' (поэтому после этой первой строки) вставьте строку' implicit none'. Затем (перекомпилировать) и посмотреть, что вы сказали компилятору. –
Я определил x0 = 1.0d0, a = x0, b = x0 в основной программе, и теперь он работает так, как я предполагал. И a, и b печатают ровно 1.0. Но у меня все еще есть проблема с функцией. fa и fb print 0.0000000000000000. Я не уверен, почему функция работает таким образом. – mike
Альтернативно к подходу 'contains' вы можете просто добавить' implicit none' в подпрограмму (и в другом месте, в идеале). Это поможет вам сделать вывод о том, что 'f' в подпрограмме является функцией с результатом' real' not 'double precision'. Естественно, это должно быть последнее. – francescalus