Фортран в формат Python плавает - PullRequest
2 голосов
/ 01 июня 2011

Я пишу интерфейс внешнего интерфейса в Python3.2, и часть окончательного вывода основана на формате Fortran.Я нашел несколько хороших примеров, и у меня не было много проблем с переводом с фортрана на питон (например, F10.3 == "{: 10.3F}" )

Тем не менее, я вижу некоторые различия в некоторых примерах вывода, которые пытается воспроизвести мой питон.

Где код Fortran содержит такие элементы, как F10.0, F9.0, ...Я вижу предоставленные пользователем данные в выходном файле примера, например 345.2300 или просто 0,0000 .Не правда ли, что .0 не предполагает десятичных дробей?Разве 345.2300 не должно стать только 345?Я считаю, что это правда в Python, он будет автоматически округлять любые десятичные дроби, и F10.0 по сути будет 10-значное целое число.Есть ли небольшая разница в Фортране, которую я не понимаю?Имеет ли поставляемое десятичное число переопределение кода формата на Фортране?Или мое понимание спецификации формата правильное, и есть некоторая проблема в коде / выводе, который я пытаюсь создать в python.

Я в основном ничего не знаю о fortran, поэтому любая помощь будет очень признательна

Спасибо, Крис

РЕДАКТИРОВАТЬ Я начинаю понимать, что, возможно, я неверно истолковываю свои спецификации для этого графического интерфейса.Мой графический интерфейс генерирует текстовый файл, который подается в другую программу, написанную на Фортране.Текстовый файл должен быть в очень специфическом формате, который продиктован (из руководства) утверждениями формата fortran.В примерах текстовых файлов, которые у меня есть, я вижу пользователя, набравшего 29.64578 для одной из переменных, и в соответствии со спецификациями это будет соответствовать F10.0.Однако текстовый файл содержит строку шириной 10, «29.64578».В моей версии Python, если пользователь набрал 29.64578, а я использовал «{: 10.0F}», текстовый файл будет отображать «30».

Должен ли я переводить F10.0 в "{: 10.0G}" вместо "{: 10.0F}" в моем питоне?

Не вызовет ли 29.64578 ошибку при сопоставлении с F10.0 в фортране?

Что будет делать код Фортрана с 29.64578, предполагая F10.0?

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

MSB правильно о входе и выходе.Если у вас нет ясности относительно операторов формата FORTRAN, могут помочь следующие примеры, использующие библиотеку fortranformat (v 0.2.2, доступную в PyPI).Обратите внимание, что библиотека была тщательно протестирована на компиляторе Intel FORTRAN 9.1 в Linux (другие платформы отличаются только в странных случаях).

>>> import fortranformat as ff
>>> # Input
>>> line = ff.FortranRecordReader('(F10.0)')
>>> line.read('29.64578')
  [29.645779999999998]
>>> # Output
>>> vals = [29.64578]
>>> line = ff.FortranRecordWriter('(F10.0)')
>>> line.write(vals)
  '       30.'

Дескриптор редактирования G, вероятно, не нужен.Он меняет свое поведение в зависимости от типа и значения входных и выходных переменных, но в этом случае будет эмулировать дескриптор редактирования F.

nb Разница в конечных цифрах на входе обусловлена ​​природойПредставление с плавающей запятой, 29.64578 не может быть представлено в конечном количестве двоичных разрядов.

Я должен определить, что я являюсь автором этой библиотеки; -)

2 голосов
/ 01 июня 2011

.0 на выходе дает десятичную точку, но после десятичной точки цифра отсутствует. При вводе в числовой строке допускаются другие цифры после десятичной дроби, которые переопределяют спецификатор формата - важна ширина и то, что ввод находится в правильных столбцах. Если примеры предназначены для ввода, они могут демонстрировать эту функцию.

0 голосов
/ 01 июня 2011

Да, дескриптор редактирования "Fw.0" подразумевает отсутствие дробных цифр.См. Раздел 10.7.2.3.2 в стандарте Fortran 2008 (N1830.pdf).

Либо ваш компилятор Fortran содержит ошибки, либо вы неправильно интерпретируете исходный код Fortran и соответствующий вывод.

Обратите внимание, что в общем случае форматирование на Fortran является довольно сложным, и перевод общего назначенияДескрипторы редактирования Fortran для Python не будут простым проектом.

...