XPEHOMETP
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору wlbmJames Цитата: ошибка скорее всего глупая, но никак не могу понять где | Ой! Ну, оно, надо бы все переменные описать правильно... Какие из них целочисленные, какие - с плавающей запятой. Директива implicit none, которую использовал Ingve, она как раз и служит для того, чтобы не было глупых ошибок с появлением неописанных переменных в результате неправильного написания их имен, а также с распределением переменных по их типу. На втором пункте следует остановиться особо. Поскольку Вы ни одной переменной не описали, то применяются обычные (с глубокой древности) для Фортрана правила: все переменные, начинающиеся с букв от i до n являются целыми, все остальные - дробными рациональными. Но есть еще вариант дробных чисел повышенной (двойной) точности (занимающих восемь байтов) и комплексных чисел - они по умолчанию начинаются, соответственно, с буковок d и c. Hy и что же мы видим в Вашей программе? Во-первых, в преамбуле есть некое уравнение Цитата:. Ну, по логике: это (похоже) число промежутков в заданном интервале от a до b. Это число - целое, переменная с именем n вполне к месту. Но: почему +1? Хотим число промежутков - значит, берем -1. Кроме того, так как a и b - рациональные числа, справа должно получиться рациональное число. Которое потом округляется до целого n, с явной потерей точности. Если, конечно, мы не прописали оператора явного перевода типа вроде real. Значит, вместо n мы должны иметь рациональную переменную. Но она, как бы, тогда теряет физический смысл, ибо число промежутков - целочисленная величина. Как быть? И это (несколько сомнительное) уравнение затем почти один в один переведено в фортрановский код. То есть, в subroutine resh есть строчка g=(b-a)/h+1. Тут как бы вопрос о том, целочисленная эта переменная или нет, временно снимается, ибо переменная g уж точно - по определению с плавающей запятой, но затем этот вопрос встает, но несколько лениво. Ибо: нужна эта переменная только для сравнения с некой переменной d. С которой проблем гораздо больше. И так, во-вторых. Имеем в программе строчку d=1. Что это означает? Что некой переменной двойной точности (да, ведь она начинается с буковки d!) присваивается значение единицы. Вполне себе целочисленное. Далее, в той же подпрограмме resh эта переменная увеличивается на 1: d=d+1, т.е. она ведет себя абсолютно как целочисленная переменная. Наверно, так ее и следовало объявить? Но: насколько законно тогда сопоставление с ней действительного числа g? Ну, еще в качестве мелочной придирки. На уровне придирок компилятора, который не хочет по-существу разобраться в предложенной программе, и начинает свои мелочные приколы. Вот у Вас заявлен цикл: Цитата: do h=hmin,hmax,dh call resh(f,a,b,h) write (1,3) h,f 3 format ('для шага h=',f8.4,2x,'интеграл',f8.4) enddo | Циклы с нецелой переменой цикла давно уже исключены из стандарта Фортрана, ибо они не гарантируют их правильного окончания. Поскольку числа с плавающей запятой хранятся в компьютере в приближенном виде. А не в точном, как целые. Целочисленную переменную цикла надо использовать, как сделано у Ingve. И KChernov про это совершенно справедливо написал. Тем не менее, даже все эти ошибки в совокупности вряд ли приведут к принципиально неверному результату - разнице на порядки. Что-то тут другое реально пакостит. PS: Посмотрел вариант, который предложил Ingve. На мой взгляд, должно в основном работать. Нехороший момент - что число промежутков (?) N_x определяется фактически как у Вас, через +1 - просто цикл начинается с нуля. Опять же, выполняемое при этом округление рационального числа до целого (N_x = (b - a)/ h_d- не вполне однозначно понимаемая операция. Тем не менее, вроде, проколов на порядки не будет. Да и в Вашей программе, не смотря ни на что, я подобного криминала не нашел... | Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 10:02 28-03-2011 | Исправлено: XPEHOMETP, 10:35 28-03-2011 |
|