2011-02-15 6 views
6

변수를 + Infinity로 설정하는 가장 안전한 방법은 무엇입니까? 현재 사용하고 있습니다 :Fortran에서 무한대

program test 
    implicit none 
    print *,infinity() 
contains 
    real function infinity() 
    implicit none 
    real :: x 
    x = huge(1.) 
    infinity = x + x 
    end function infinity 
end program test 

더 좋은 방법이 있을까요?

답변

7

컴파일러 supports ISO TR 15580 IEEE 산술은 ieee_ * 모듈의 절차를 사용할 수있는 것보다 소위 Fortran 2003 표준의 일부입니다.

PROGRAM main 

    USE ieee_arithmetic 

    IMPLICIT NONE 

    REAL :: r 

    IF (ieee_support_inf(r)) THEN 
    r = ieee_value(r, ieee_negative_inf) 
    END IF 

    PRINT *, r 

END PROGRAM main 
0

가장 안전한 방법에 대해 잘 모르지만 다른 방법을 제공 할 수 있습니다.

PROGRAM infinity 
    IMPLICIT NONE 
    INTEGER :: inf 
    REAL :: infi 
    EQUIVALENCE (inf,infi) !Stores two variable at the same address 
    DATA inf/z'7f800000'/ !Hex for +Infinity 
    WRITE(*,*)infi 
END PROGRAM infinity 

당신이 당신의 컴파일러를 처리하는 방법에주의를 기울여야한다 (I이 일반적으로 적당하다 생각하지 않는다) 표현에 뛰어난 값을 사용하는 경우, 당신은 몇 가지를 얻을 수 있습니다 : 나는이 방법을 배운 그렇지 않으면 예상치 못한 결과가 발생합니다.

0
나는 IEEE 표준을 지원하는 컴파일러에 의존하지 것이며, 거의 두 변화, 무슨 짓을했는지 않습니다

:

  1. 난 당신이 할 수있다 몇몇 컴파일러에 있기 때문에, huge(1.)+huge(1.)을 추가 할 것 결국 -huge(1.)+1으로 끝나고 --- 이로 인해 메모리 누수가 발생할 수 있습니다 (이유를 모르지만 실험적 사실입니다).

  2. 여기에 real 유형을 사용하고 있습니다. 나는 개인적으로 모든 부동 소수점 숫자를 real*8으로 유지하는 것을 선호하므로 모든 부동 상수는 huge(1.d0)과 같이 d0으로 규정됩니다. 물론 이것은 규칙이 아닙니다. 어떤 사람들은 real -s와 real*8 -s를 모두 사용하는 것을 선호합니다.

+2

'* 8' 실제와'더블 precision' ('1.d0'가) necesarilly 같은 실제 종류하지 않습니다 얻을. 물론 단일 또는 이중 정밀도를 사용할지 여부는 개인적인 취향에 대한 질문이 아니라 수학적 논증과 테스트에 대한 질문입니다. –

1

해결사가 모든 컴파일러에서 작동하는지 모르겠지만 무한대로 -log (0)로 도달하는 좋은 수학적 방법입니다.

program test 
    implicit none 
    print *,infinity() 
contains 
    real function infinity() 
    implicit none 
    real :: x 
    x = 0 
    infinity=-log(x) 
    end function infinity 
end program test 

또한 복잡한 변수에도 적합합니다.

+0

FPE 트래핑을 활성화하지 않으면 IEEE 준수 컴퓨터에서 작동합니다. 그러나 무한과 함께 일한다면 그렇게하는 것이 어리석은 일입니다. –

0

이것은 나를 위해 작동하는 것 같습니다. 그런 파라미터

double precision,parameter :: inf = 1.d0/0.d0 

정의 시험을 경우에 사용한다. ifort & 실행 컴파일 할 때

real :: sng 
    double precision :: dbl1,dbl2 

    sng = 1.0/0.0 
    dbl1 = 1.d0/0.d0 
    dbl2 = -log(0.d0) 

    if(sng == inf) write(*,*)"sng = inf" 
    if(dbl1 == inf) write(*,*)"dbl1 = inf" 
    if(dbl2 == inf) write(*,*)"dbl2 = inf" 
    read(*,*) 

, 나는

sng = inf 
dbl1 = inf 
dbl2 = inf 
관련 문제