Как использовать и проверять точность 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) он работает.