Что такое переносимый формат для полного выражения значения двойной точности в Фортране? - PullRequest
0 голосов
/ 16 мая 2018

Предположим, я хочу записать значение двойной точности в файл ASCII с полной точностью в переносимой форме.(Очевидно, что необработанный двоичный вывод является наиболее компактным способом выражения числа, но здесь я не об этом спрашиваю.)

Я хочу, чтобы другая программа, написанная, например, на MATLAB или Python, моглачтобы прочитать файл и сохранить то же самое значение, которое внутренне имеет программа на Фортране.

Вывод ASCII по умолчанию выполняется просто следующим образом:

program main
   use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT
   implicit none

   real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp

   write(stdout,*) pi            ! Test the default format 
   write(stdout,'(f)') pi        ! Test the specific decimal default format
   write(stdout,'(f20.15)') pi   ! Probably sufficient precision...
   write(stdout,'(f30.20)') pi   ! EXCESSIVE PRECISION!

end program main

Я понимаю, что разные компиляторымогут иметь различные значения форматирования по умолчанию и требования.Например, ifort компилирует вышеприведенный пример без проблем и выдает следующий вывод:

   3.14159265358979
       3.1415926535897931
   3.141592653589793
        3.14159265358979311600

gfortran (версия 4.8.2 gcc), с другой стороны, требует ширину для второго выводаутверждение, поэтому компиляция не удалась.Комментируя, что второй выходной оператор '(f)' разрешает компиляцию, и результат (с добавленной здесь пустой строкой):

   3.1415926535897931

   3.141592653589793
        3.14159265358979311600

У меня нет доступа к nagfor и я не установил никакой другой Fortranкомпиляторы, поэтому я не проверяю их здесь.

Вы заметите, что результаты могут отличаться.Я ожидаю, что ни один из результатов не является точным, но скорее точным с точностью до машины.Конечно, ~ 15 цифр приемлемо для большинства целей, но мне любопытно, чтобы вывод с полной точностью был таким, чтобы число можно было передавать между программами через вывод ASCII без потери точности.

Мой вопрос

Существует ли портативный способ вывода real с полной точностью?Я специально прошу real с двойной точностью, но если есть kind независимый способ сделать это, я бы предпочел этот ответ.Предположительно можно было бы использовать подход «ЧРЕЗВЫЧАЙНАЯ ТОЧНОСТЬ», но бонусные баллы за лаконичность тоже.

Ответы [ 2 ]

0 голосов
/ 18 июля 2018

Как правило, если у вас на три знака больше десятичных цифр, чем может представлять тип данных, вы не потеряете ни одного бита.Так что для IEEE с плавающей запятой двойной точности это будет 18 цифр.

Ваш второй формат использует нестандартный синтаксис, который поддерживает ifort, а gfortran - нет.Я не рекомендую его использовать.

Fortran 2018 предлагает «шестнадцатеричный формат» для реальных значений, который сохраняет все биты, но я думаю, что это понимает только C / C ++.

0 голосов
/ 18 июля 2018

Требуемый формат: ES24.17

.
...