Предположим, я хочу записать значение двойной точности в файл 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
независимый способ сделать это, я бы предпочел этот ответ.Предположительно можно было бы использовать подход «ЧРЕЗВЫЧАЙНАЯ ТОЧНОСТЬ», но бонусные баллы за лаконичность тоже.