![]() |
|
|
![]()
|
|
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
Всем знатокам фортрана добрый день!
Я давно работаю на Ф. (уже лет 10), но все равно периодически натыкаюсь на совершенно непонятные вещи. Буду очень признательна всем, кто расскажет мне, от чего могут возникать подобные глюки. 1) результат вычислений зависит от промежуточного вывода. Т.е. считаю какую-то величину (как правило, интрегрированием) - получаю NAN. Вывожу промежуточные результаты, частичные суммы - получаю уже число, не NAN 2) печать данных - результат зависит от запроса. Т.е. от того, прошу ли я print *, d1, d2, d3 или print *, d3 (в одной и той же строке, просто комментируя или стирая лишние запросы) - я вижу разные величины для d3. Пользуюсь линуксовским gfortran, обычно стараюсь не использовать оптимизацию. Раньше использовала другие компиляторы, но подобные проблемы периодически наблюдались вне зависимости от компилятора. Всем заранее спасибо. |
|||
|
||||
| BakinEugene |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.9.2011 Где: Челябинск Репутация: нет Всего: нет |
Фантастика какая-то Приведите пример программы. |
|||
|
||||
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
Пример не дам
И, кроме того, это ничего не даст. Потому как в этом месте ошибки точно нет, и очевидно, что это не моя ошибка а реальный глюк. Мне больше интересны именно такие же примеры у бывалых - откуда такое вообще берется, и как вообще с этим справляться. |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
Конечно, хотелось бы посмотреть на примеры, однако один возможный вариант - не совсем корректный код, при оптимизации которого компилятор допускает ошибки.
Кстати, вместе с примерами хорошо было бы увидеть вывод и точную версию использовавшегося компилятора. Добавлено через 14 минут и 39 секунд Да, как вариант - попробуйте сменить компилятор и посмотреть, что получится. |
|||
|
||||
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
Спасибо, я в общем и сама понимаю, что скорее всего это некорректный код. Просто когда имеется несколько десятков тысяч строк, хочется иметь подсказку - чего собственно искать-то?
Компилятор сменить проблематично, так как у меня нет админских прав, а по умолчанию стоит только один gfortran. Собственно, на данный момент проблему я обошла (но не решила). После замены команды gfortran на gfortran -O1 (т.е. включение оптимизации) проблема исчезла. Однако я понимаю, что та самая некорректность в коде никуда не делась, и она еще может вылезти потом - поэтому отловить хочется. Это кусок кода: http://s2.ipicture.ru/Gallery/Viewfull/6100499.html# В зависимости от того, какая строка print закомментирована, получается следующий результат: http://s2.ipicture.ru/Gallery/Viewfull/6100492.html# Здесь видно два последовательных запуска скрипта main2.sh. Это мини-скрипт, который компилирует программу, а потом сразу запускает исполняемый файл. Жду комментариев от мудрых, и всем заранее спасибо! UPD: версия фортрана 4:4.5.2-1ubuntu3 (The GNU Fortran 95 compiler) P.S. С картинками что-то не срослось, пришлось оставить их как ссылки. Это сообщение отредактировал(а) Nutsy - 30.9.2011, 11:36 |
|||
|
||||
| kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: нет Всего: 160 |
А чтоб дать подсказку, хочеться хотя бы одним глазком взнлянуть на десятки тысяч строк кода. Выход слева, в верхнем углу. Судя по плотности оператора STOP...
Что конкретно я там должен увидеть? Что 2 программы, составленные из разных операторов вывода печатают разный результат? К.О. поперхнулся. Да, а я Ленина живым видел. Хотя... Вот Вы разве что работаете. А на нём программировать надо. Это сообщение отредактировал(а) kemiisto - 30.9.2011, 11:56 -------------------- |
||||
|
|||||
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
kemiisto, спасибо за полезный и содержательный ответ.
|
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: нет Всего: 160 |
Nutsy, всегда к Вашим услугам.
Теперь попробуем по пунктам. Если Вы отказываетесь показывать исходный код (что бывает часто), нужно показать минимальный пример, на котором описанные "баги" проявятся. Тут, правда, надо в Вашем коде локализовать "баг", чего мы сделать за Вас не можем. Хотя бы потому, что код от нас скрыт. Если локализовать сами не можете, а код показывать отказываетесь, то, чем, собственно, мы можем Вам помочь? -------------------- |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
В принципе, я согласен с kemiisto - сказать что-то внятное по этому куску кода невозможно. Разве что одна деталь...
Я правильно понимаю, что весь код написан на 77-м Фортране? Если да: в нем используются COMMON-блоки и EQUIVALENCE? указывается ли стандарт языка при компиляции явно? почему в качестве компилятора не используется g77? |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
Что-то там тяжело разобрать, что и где отличается. И насколько сильно отличается? Напиши прямо здесь инструкции вывода и результаты - может быть полезно, чтобы понять, насколько отличается. Еще интересно узнать 1) используется ли неявная типизация или, как рекомендуется, IMPLICIT NONE? 2) не смешиваются ли в выражениях типы с плавающей точкой разной точности? Это сообщение отредактировал(а) FCM - 1.10.2011, 13:50 |
|||
|
||||
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
Для начала хотела поблагодарить всех за внимание к моей проблеме
Сразу поясню - к сожалению, Фортран мне преподавали на уровне простейших программок. Все остальное пришлось изучать самой, причем на старых чужих программах. Так что весьма вероятно, что мои знания малы и сумбурны. Программа, с которой сейчас работаю, состоит из чужого кода (примерно 10тилетней давности), каких-то пакетов, стандартных процедур (типа диагонализации матриц), ну и конечно моего кода. Так ошибка может быть и не у меня Теперь по вопросам. Попробую объяснить в чем была проблема: если я пишу print *, rho3 то на выходе вижу 1.010273778... если в той же строчке, ничего кроме нее не меняя, дописываю еще одну переменную поглядеть print *, rho1, rho3 вижу 1.000000010... 0.9999999989... то есть второе выводимое значение (которое выводилось и раньше) почему-то меняется. Собственно, программа была в процессе отладки, когда вот это нашлось. Тут даже не идет речь об ошибках или чем-то еще - это явный и очевидный глюк. И он явно не в этой конкретной строчке.... Фантом Да, изначально использовался f77. При компиляции ничего явно не указываю. Компилирую следующей командой: gfortran -O1 -o main.out main.f o/*.f Common-блоки использую очень и очень активно, без них вообще никак и никуда. Про equivalence слышу впервые - так что видимо не исользую. FCM Ответ конечно отличается не то чтобы сильно, где-то в 3-4 знаке. Проблема в том, что мне нужно больше, так как итоговый ответ складывается из нескольких чисел, и идет значительное сокращение (те же 3-4 знака). Неявная типизация используется. Обычно идет implicit real*8 (a-h,o-y) implicit complex*16 (z) в этом куске кода правда обошлись без комплексных чисел. Второй Ваш вопрос не очень поняла, отвечу как смогу. Все вещественные числа имеют одинаковую точность, а когда в выражениях фигурируют и вещественные, и целые - стараюсь менять тип, например, так d = dsqrt(i*1.d0) Какой будет диагноз? |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
| Nutsy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.9.2011 Репутация: нет Всего: нет |
Фантом
Спасибо, попробую. Мое видение проблемы на данный момент такое - где-то в коде (может, моем, может, предшественников) затесалась какая-то мелккая некорректность. Обычно компилятор ее проглатывает, но иногда не везет - и случается вот такой глюк. Отсюда вопрос: может, есть какой-нибудь очень-очень злой компилятор, который ругается на все что некорректно? Авось и нашлась бы тогда ошибочка... |
|||
|
||||
| Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: 5 Всего: 49 |
||||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: 8 Всего: 9 |
А что будет, если написать print *, rho3, rho1 или print *, rho3, rho3 или print *, rho3, rho1, rho3 Это сообщение отредактировал(а) FCM - 5.10.2011, 10:03 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Fortran | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |