2013-09-18 6 views
3

Есть ли способ поймать целочисленные исключения с gfortran или ifort как есть для ловли исключений с плавающей запятой?Исключение целых целых чисел в Fortran

Рассмотрим эту простую программу для вычисления факториала:

program factorial 
    use, intrinsic :: iso_fortran_env 

    implicit none 
    integer(8)   :: fac 
    real(REAL64)  :: facR 
    integer,parameter :: maxOrder = 30 
    integer    :: i 

    fac = 1 ; facR = 1.e0_REAL64 
    do i=2,maxOrder 
    fac=fac*i ; facR=facR*real(i,REAL64) 
    write(*,*) i, fac, facR 
    enddo ! i 

end program 

В какой-то момент будет переполнение - для integer(8), как показано здесь, это будет происходить на уровне около 21. Но без расчета с использованием поплавков в качестве ссылка я не мог точно сказать ...

ответ

3

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

huge(2_8)+1 < 0_8 

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

Уверен, что ни Intel Fortran, ни gfortran не обеспечивают проверку целостности с использованием компилятора во время выполнения. Я не уверен в других компиляторах, но я буду (приятно) удивлен, узнав, что любой из них.

Я думаю, поэтому вам необходимо продолжить свой нынешний подход.

0

gfortran поймает целочисленное переполнение с -ftrapv флаг см человека GCC:

-ftrapv Эта опция создает ловушки для знакового переполнения на операции сложения, вычитания, умножения.

ifort, похоже, не имеет такой возможности.

Смежные вопросы