Получу ли я больше точности в Фортране с `real (wp)`? - PullRequest
1 голос
/ 07 января 2020

Простой вопрос:

Получил ли я больше точности в своем коде, заменив все:

real(dl) variable1

, поместив в начале каждого исходного файла Fortran90 :

integer, parameter :: wp = selected_real_kind(15,307)

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

real(wp) variable1

?

ОБНОВЛЕНИЕ 1: Вы правы, простая программа дает:

program  main

  implicit none

  integer, parameter :: dl = KIND(1.d0)
  integer, parameter :: wp = selected_real_kind(15,307)
  real(kind=dl) :: dl_number
  real(kind=wp) :: wp_number

  write(*,*) 'epsilon for dl number', epsilon(dl_number)
  write(*,*) 'precision for dl number', precision(dl_number)
  write(*,*) 'epsilon for wp number', epsilon(wp_number)
  write(*,*) 'precision for wp number', precision(wp_number)

  stop

end

И вывод:

epsilon for dl number   2.2204460492503131E-016
 precision for dl number          15
 epsilon for wp number   2.2204460492503131E-016
 precision for wp number          15

Поэтому нет необходимости использовать wp = selected_real_kind(15,307) вместо dl = KIND(1.d0).

Спасибо

1 Ответ

4 голосов
/ 07 января 2020

В общем, нет.

Есть две проблемы:

  1. Является ли wp с более высокой точностью чем dl? Это зависит от компилятора и платформы.

  2. Улучшается ли численный результат за счет увеличения точности чисел с плавающей запятой? В некоторых случаях точность ограничена алгоритмом или данными, и вы ничего не получите от этого, кроме более медленной программы.

В качестве первого диагноза в любом случае выполните

write(*,*) 'dl =', dl
write(*,*) 'wp =', wp

, чтобы увидеть, являются ли виды на самом деле одинаковыми.

Затем вы можете получить некоторую информацию о видах:

real(kind=dl) :: dl_number
real(kind=wp) :: wp_number

write(*,*) 'epsilon for dl number', epsilon(dl_number)
write(*,*) 'precision for dl number', precision(dl_number)
write(*,*) 'epsilon for wp number', epsilon(wp_number)
write(*,*) 'precision for wp number', precision(wp_number)

epsilon возвращает наименьшее представимое число для вида и precision десятичная точность.

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

Как указывает Альберт и Ян Бу sh, в коде есть много других мест, где вам нужно проверить проблему числового представления.

  • Буквальные константы нуждаются в особом уходе. Например, 1.0/3.0 и 1._wp/3._wp имеют существенно разные значения.
  • Некоторые функции также возвращают реальное значение по умолчанию (т.е. одинарную точность), если не требуется, например, real intrinsi c.
  • ...
...