Как использовать и проверять точность quad в gfortran?

Я пытаюсь использовать точность quad в gfortran, но это похоже на real*16 не работает. После некоторой рыбалки я обнаружил, что она может быть реализована как real*10. Is real*10 на самом деле квада точности?

как я могу проверить точность моего кода? Существует ли стандартный простой алгоритм проверки точности? Например, когда я хочу выяснить, что такое компьютерный ноль, я продолжаю делить на 2.0, пока не достигну 0.0. Отслеживание значений позволяет я знаю, когда компьютер "думает", что мое ненулевое число равно нулю-дает мне компьютерный ноль.

есть ли хороший способ выяснить точность с типом алгоритма, как я описал?

5 ответов


добавление к существующим ответам... real*N является расширением языка и лучше не использовать. real * 10 не является четырехъядерной точностью. Is называется "extended" - это 10-байтовый тип, предоставляемый процессорами Intel. real * 16 может быть или не быть доступен на gfortran, в зависимости от версии компилятора, аппаратного обеспечения и доступности libquadmath. Если это предусмотрено в программном обеспечении, это будет медленно.

способ Fortran запрашивать точность, которую вы хотите, - использовать selected_real_kind функция для определения значения вида для требуемой точности.

integer, parameter :: QR_K = selected_real_kind (32)
real (kind=QR_K) :: MyReal

получит квадратичное вещественное число, если оно доступно. Кроме того, с Fortran 2008 или более поздней версии вы можете "использовать ISO_FORTRAN_ENV", а затем иметь доступ к значению вида REAL128. Какие значения будут 1, если точность недоступна.

вопрос: что означает` real*8'?


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

real(some_kind_value) :: variable

затем вы можете использовать selected_real_kind() или iso_fortran_env модуль или c_long_double вид стоимости от iso_c_binding модуль для получения переменной вида. Все они имеют несколько иное значение.

можно использовать epsilon(), tiny(), huge() или nearest() intrinsics для оценки фактической точности вашего кода.

точность квада в gfortran вообще требует libquadmath библиотека, которая должна быть доступна для большинства платформ, но, возможно, не по умолчанию.


документация gfortran для вид параметры типа ответы на этот вопрос, в частности последнее предложение, которое гласит:

доступные параметры вида можно найти в постоянных массивах CHARACTER_KINDS, INTEGER_KINDS, LOGICAL_KINDS и REAL_KINDS в Модуль ISO_FORTRAN_ENV (см. ISO_FORTRAN_ENV).

возможно, вы обнаружили, что real*16 не реализован на вашей платформе.


real (kind=10)-это так называемая расширенная 80-битная точность Википедия 80-бит.

real (kind=16) является правильным четырехкратным 128-битным precition Википедия 128-битное.

Как уже упоминалось, вы можете использовать selected_real_kind(), epsilon(), tiny (), huge () для выбора и проверки точности.


попробуйте команду gfortran

тест gfortran-fdefault-real-8.f-o тест.exe

в тестовом файле

      implicit double precision(a-h,o-z)
 1    continue
      print * , ' i:'
      read(5,*) i
      if(i.le.0) stop
      a=i
      b=sqrt(a)
      print * , b
      c=b*b
      print * , c
      goto 1
      end

на моей платформе (FEDORA 20) он работает.