Положительные / отрицательные постоянные в Фортране - PullRequest
0 голосов
/ 30 мая 2018

Как я могу получить константы (или parameter с, я полагаю), которые являются отрицательной и положительной бесконечностью в Фортране 2008?Я попробовал следующий код:

program inf
  use, intrinsic :: ieee_arithmetic

  real(8), parameter :: inf_pos = ieee_value(0d0, ieee_positive_inf)
  real(8), parameter :: inf_neg = ieee_value(0d0, ieee_negative_inf)
end program inf

Однако я получаю следующие ошибки:

$ gfortran inf.f08
inf.f08:4:22:

   real(8) :: inf_pos = ieee_value(0d0, ieee_positive_inf)
                  1
Error: Function ‘ieee_value’ in initialization expression at (1) must be an intrinsic function
inf.f08:5:22:

   real(8) :: inf_neg = ieee_value(0d0, ieee_negative_inf)
                  1
Error: Function ‘ieee_value’ in initialization expression at (1) must be an intrinsic function

Несмотря на то, что в документации сказано иное, кажется, что gfortran считает, что ieee_value() не является внутренним.

Есть ли способ получить то, что я пытаюсь сделать?

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Сначала я посмотрю, почему вы не можете использовать ieee_value, чтобы дать значение для желаемой именованной константы, затем я сообщу плохие новости.Оба интересны (для меня).

ieee_value не внутренняя процедура.Это процедура встроенного модуля, но, как отмечено в стандарте Fortran 2008 (Примечание 13.25):

Типы и процедуры, определенные в стандартных встроенных модулях, сами по себе не являются внутренними.

gfortran правильно, заметив, что ieee_value не может использоваться в выражении инициализации (константы).

Теперь, если вам нужно инициализировать именованную константу с "бесконечным" значением, есть непереносимые опции: 1 .

  • аналогично В этом вопросе о NaN вы можете разработать требуемый битовый шаблон и инициализировать с помощью transfer;
  • вы можете быть в состоянии написать «переполненное» выражение инициализации.

Вы можете обойти непереносимый характер этого с вашей системой сборки и препроцессором.

Все это говорит о том, что вам может не понадобиться бесконечная именованная константа.Модули IEEE легко предоставляют процедуры для «это значение бесконечно?» Или «установить это значение как бесконечное».Ваш компилятор также может иметь «инициализировать переменную в бесконечность» в качестве параметра времени компиляции.


1 Вне внешних выражений инициализации ограничения на использование ieee_value намного слабее.

0 голосов
/ 31 мая 2018

Следующее приведет к + и - Infinity, однако, должна быть выполнена и не принята как инициализация непосредственно в объявлении переменной:

program testinf
implicit none
double precision :: x, xiplus, xineg   
x       = HUGE(x)
xiplus  = 2 * x     ! yields +Infinity
xineg   =-2 * x     ! yields -Infinity
write(*,*)x , xiplus, xineg 
end program testinf
0 голосов
/ 30 мая 2018

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

program inf
  use, intrinsic :: ieee_arithmetic

  print *, inf_pos()
  print *, inf_neg()

contains
  pure function inf_pos() result(r)
    real(8) :: r
    r = ieee_value(0d0, ieee_positive_inf)
  end function inf_pos

  pure function inf_neg() result(r)
    real(8) :: r
    r = ieee_value(0d0, ieee_negative_inf)
  end function inf_neg
end program inf
...