Преобразование рабочего кода из двойной точности в четверную точность: как читать числа четверной точности в FORTRAN из входного файла

У меня есть большой старый код на FORTRAN 77, который работал много-много лет без проблем. Двойной точности уже недостаточно, поэтому для преобразования в четверную точность у меня есть:

  1. Все вхождения REAL8 заменены на REAL16.
  2. Заменены все функции, такие как DCOS(), на такие функции, как COS().
  3. Заменены все встроенные числа, такие как 0.d0 на 0.q0 и 1D+01 на 1Q+01.

Программа компилируется без ошибок и предупреждений компилятором gcc-4.6 на

  1. операционная система: openSUSE 11.3 x86_64 (64-разрядная операционная система)
  2. аппаратное обеспечение: Intel Xeon E5-2650 (Sandy Bridge)

Моя переменная LD_LIBRARY_PATH установлена ​​в папку 64-битной библиотеки: /gcc-4.6/lib64

Программа читает входной файл, содержащий числа. Раньше эти числа имели форму 1.234D+02 (для версии кода с двойной точностью, которая работает). Я изменил их, так что теперь это число 1.234Q+02 , однако я получаю ошибку времени выполнения:

Неправильное действительное число в элементе 1 ввода списка

Указывает, что подпрограмма, считывающая данные из входного файла (названная read.f), не находит первое число во входном файле, чтобы быть совместимым с ожидаемым.

Как ни странно, версия кода с четверной точностью не жалуется, когда входной файл содержит числа вроде 1,234D+02 или 123,4 (которые, судя по выходным данным, автоматически преобразуются в форму 1,234D). +02, а не Q+02), ему просто не нравится Q+02 , поэтому кажется, что gcc-4.6 не позволяет считывать числа с четверной точностью из входных файлов в экспоненциальном представлении!

Удалось ли кому-нибудь когда-нибудь прочитать из входного файла число четверной точности в экспоненциальном представлении (например, 1234Q+02) на FORTRAN с помощью компилятора gcc, и если да, то как вы заставили его работать? (или вам понадобился другой компилятор/операционная система/аппаратное обеспечение, чтобы заставить его работать?)


person user1271772    schedule 08.08.2013    source источник
comment
Похоже, вы объединяете текстовое представление реального определенного типа в источнике с текстовым представлением реальных данных во входном файле. Нет необходимости иметь другой символ экспоненты во входном файле - просто используйте E. Процессор Fortran (здесь представлен библиотеками времени выполнения вашего компилятора) преобразует это текстовое представление во входном файле в любое подходящее внутреннее представление, которое использует программа.   -  person IanH    schedule 09.08.2013
comment
Это именно тот тип задач, где вы должны использовать обозначение вида (real(wp) и 1._wp). Затем вы просто настраиваете wp в верхнем модуле на то, что вам нужно в данный момент.   -  person Vladimir F    schedule 09.08.2013
comment
Спасибо @IanH! Я изменил все Q на D во входном файле, и программа запустилась. Я оставил этот вопрос, потому что я все еще хочу, чтобы моя программа могла читать в 12Q + 01, поскольку мои входные файлы генерируются другой программой. Могу ли я также оставить все жестко закодированные числа, такие как 1.234D+02, в реальных файлах .f, как D+02 вместо Q+02, и полагаться на компилятор, чтобы преобразовать их в четверную точность на основе того факта, что их соответствующие переменные REAL*16 ? Мне бы очень хотелось иметь только один код с #define, контролирующий выбор REAL*8 и REAL*16, и никаких других изменений.   -  person user1271772    schedule 11.08.2013
comment
По прошествии такого длительного времени вам действительно следует задать новый вопрос. У вас есть пара синтаксических ошибок.   -  person Vladimir F    schedule 16.07.2016
comment
Я думал, что правильно следовал инструкциям M.S.B. Какие синтаксические ошибки?   -  person user1271772    schedule 16.07.2016
comment
Нет, задайте новый вопрос.   -  person Vladimir F    schedule 16.07.2016
comment
вам действительно нужно начать новый вопрос, но я спрошу, вот ваши входные файлы с четырехкратной точностью действительно с четырехкратной точностью, т.е. как 30+ десятичных цифр?   -  person agentp    schedule 16.07.2016
comment
@VladimirF: В ответ на ваш запрос я задал новый вопрос: stackoverflow.com/questions/38415703/. Я просто беспокоюсь о том, что за это проголосуют, потому что на самом деле это всего лишь вопрос о том, как реализовать предложение М. С. Б. в его / ее ответе на этот вопрос. Я просто не могу получить простую версию его предложения для компиляции (он предложил использовать ISO_FORTRAN_ENV и WP = real128 между программой и неявным none. Это то, что я сделал. Затем я объявил переменные точно так, как показал М. С. Б.   -  person user1271772    schedule 17.07.2016
comment
@agentp: Вы правильно думаете. Входные файлы содержат несколько простых чисел, таких как 1.234Q+02. Предложение IanH преобразовать все показатели в форме входного файла (D или Q) в E было успешным. Мой входной файл теперь содержит только показатели степени, определяемые E, а не D или Q.   -  person user1271772    schedule 17.07.2016


Ответы (1)


Почти все это уже есть в комментариях @IanH и @Vladimi.

Я предлагаю добавить немного Fortran 90 в ваш код FORTRAN 77.

Напишите все свои числа с буквой «Е». Измените свою другую программу, чтобы записать данные таким образом. Не беспокойтесь о «D» и не пытайтесь использовать редко поддерживаемую «Q». (Использование «Q» в константах в исходном коде является расширением gfortran — см. 6.1.8 в руководстве.)

Поскольку вы хотите, чтобы один и тот же исходный код поддерживал две точности, в верхней части программы есть:

use ISO_FORTRAN_ENV
WP = real128

or

use ISO_FORTRAN_ENV
WP = real64

как вариант, который изменяет, использует ли ваш код двойную или четверную точность. Это использует среду ISO Fortran Environment для выбора типов по их количеству бит. (use должен находиться между program и implicit none; оператор присваивания после implicit none.)

Затем объявите свои настоящие переменные через:

real (WP) :: MyVar

В исходном коде записывайте реальные константы как 1.23456789012345E+12_WP. _type — это способ указания типа константы в Fortran 90. Таким образом, вы можете переключаться между двойной и четверной точностью, изменяя только одну строку, определяющую WP.

WP == Рабочая точность.

Просто используйте «E» во входных файлах. Fortran будет читать в соответствии с типом переменной.

Почему бы не написать крошечную тестовую программу, чтобы проверить это?

person M. S. B.    schedule 11.08.2013
comment
Уважаемый M.S.B., я попробовал очень простой код (см. расширение внизу моего первоначального вопроса). Выдает ошибки во время компиляции. Не могли бы вы дать нам минимальный рабочий пример? - person user1271772; 15.07.2016