정보

    • 업무명     : 포트란을 활용한 에러 : 개요, NaN and Inf3, 예외 처리 (Exception), 에러 종류와 예시

    • 작성자     : 이상호

    • 작성일     : 2020-11-11

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • 안녕하세요? 웹 개발 및 연구 개발을 담당하고 있는 해솔입니다.

    • Fortran (포트란)은 수식 (Formular) 변환기 (Translator)의 약자로 과학 계산용으로 주고 사용되는 언어입니다.

    • 복잡한 계산 수행 성능이 뛰어나 공학과 자연과학 등 특정분야에 주로 사용되며 기상 데이터 처리를 위해 널리 사용되고 있습니다.

    • 오늘 포스팅은 포트란을 활용한 에러를 소개합니다.

     

     

    [특징]

    • 기상 데이터 처리를 위해서 포트란 (Fortran)기술이 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 기술서

     

    [기능]

    • 개 요

    • NaN and Inf

    • 예외 처리(Exception)

    • 에러 종류와 예시

     

    [활용 자료]

    • 없음

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 없음

     

    [사용 OS]

    • Linux (CentOS v7.8)

     

    [사용 언어]

    • gfortran v4.8.5

     

     세부 내용

    개요
    • 고급프로그래머라 할지라도 한번의 코딩으로 프로그램을 한번의 컴파일로 한번에 정확히 실행시키기는 어렵습니다.

    • 프로그램의 에러를 컴퓨터전문 용어로 버그라고 합니다.

    • 버그의 어원은 최초컴퓨터인 애니악에 어떠한 에러가 발생하게 됩니다. 그 에러 원인은 나방 (bug)에 의한 벨브 이상으로 생긴 에러였습니다. 

    • 그 에러 원인을 찾아 이 버그를 찾는데 몇 일이 소요되었다. 에서 버그라는 말이 생기게 되었습니다.

    • 그리고 이렇게 에러를 찾고 수정하는 것을 디버깅이라고 합니다.

    • 이 장에서는 한 프로그램에서 발생할 수 있는 오류의 종류와 예외처리 방안에 대해서 알아보겠습니다.

     

    NaN and Inf
    • NaN

      • 0.0/0.0에 대하여 표현할 방법이 없습니다. 0.0/x는 x가 0일 경우를 제외 하고 언제나 0.0 입니다.

      • 따라서 0은 의미 있는 값이라 할 수 있습니다.

      • 그러나 x/0.0 은 x가 0이어도 INF 입니다. 한편 x/x 는 x가 0이지 않는 이상 항상 1이 됩니다.

      • 따라서 이러한 0.0/0.0은 Not a Number 즉 NaN 이라 합니다

     

    PROGRAM nan 
    
      IMPLICIT none 
      
      PRINT *, 0.0/0.0 
      
    END PROGRAM nan

     

    결과
    NaN

     

    • Inf

      • 포트란 언어에 대한 흥미로운 것 중 하나는 일반적으로 없는 숫자 값에 대한 표현이 포함되어 있다는 것입니다.

      • 예를 들어 일반적인 연산에서는 7.7/0.0의 값은 정의되지 않습니다.

      • 그러나 7.7/x는 x가 점점 커질수록 점점 0.0에 가까워지게 된다고 설명 할 수 있습니다.

      • 이것이 7.7/0.0의 결과가 양의 무한대(INF)를 말하기 위한 기초입니다.

      • 마찬가지로 -7.7/x는 음의 무한대(-Inf)라 하겠습니다.

    PROGRAM inf
    
      IMPLICIT none 
      
      PRINT *, 7.7/0.0, -7.7/0.0 
      
    END PROGRAM inf

     

    결과
    +Inf -Inf

     

    • ieee_arithmetic

      • ieee_arithmetic은 포트란 내장 모듈 입니다.

      • ieee_arithmetic 내장 모듈은 프로그램 안에서 자신이 가진 매개변수와 프로시저를 사용하여 연산 값을 확인하는데 편리합니다.

      • ieee_value에서 사용되는 매개변수 명칭을 이용하여(그렇지 않으면 에러가 발생) 해당하는 값을 나타낼 수 있습니다.

      • NaN값은 두 가지 경우로 만들어 지는데 그 중 하나는 에러를 내지만 다른 하나는 에러가 발생하지 않습니다.

      • 이러한 실수를 줄이기 위하여 이 모듈을 사용하여 Inf인지 NaN 인지 확인하는 것을 권합니다.

      • 모듈 및 프로시저에 대한 설명은 다음에 자세히 하도록 하겠습니다.

    PROGRAM ieee_naninf
    
      USE, INTRINSIC :: ieee_arithmetic
    
      IMPLICIT none 
    
      REAL :: NaN, Inf
    
      NaN = ieee_value(0.0, ieee_quiet_nan) 
      Inf = ieee_value(0.0, ieee_positive_inf) 
    
      PRINT *, Inf, NaN
    
    END PROGRAM ieee_naninf
    

     

    결과
    +Inf NaN

     

    PROGRAM ieee_test_naninf
      
      USE, INTRINSIC :: ieee_arithmetic
    
      IMPLICIT none 
    
      REAL :: NaN, Inf
    
      NaN = ieee_value(0.0,ieee_quiet_nan) 
      Inf = ieee_value(0.0,ieee_positive_inf)
    
      PRINT *, ieee_is_nan(NaN), ieee_is_nan(7.7), ieee_is_nan(Inf) 
      PRINT *, ieee_is_finite(7.7), ieee_is_finite(Inf) 
      PRINT *, Inf==NaN, NaN==NaN, NaN/=NaN
    
    END PROGRAM ieee_test_naninf

     

    결과 
    T F F
    T F 
    F F T

     

    예외 처리 (Exception)
    •  
    • ieee_exceptions

      • 프로그램은 종종 계산이 이상한 결과를 생성하여 에러가 발생 할 때 화면에 에러 메세지를 출력하고 프로그램이 중단됩니다.

      • 그러나 프로그램이 바로 중단되지 않고 문제가 있을 경우 확인하고 시정조치를 취하는 것이 중요 할 수 있습니다.

      • 예를 들어 숫자가 너무 커질 경우 모든 데이터는 1,000 배의 크기가 축소시키고 계산을 다시 수행하게 하는 것입니다.

      • 일반적으로 이러한 경우에는 미분 방정식 정교한 계산을 수행하는 전문가에 의해 작성된 프로그램에서 필요하게 됩니다.

      • 이러한 상황은 매우 복잡한데 간단히 예를 들어 우리가 사용할 수 있는 방법을 이야기 하려 합니다.

      • 실제 값보다 훨씬 큰 곱셈을 하여 오버플로우가 발생할 것이라고 가정하겠습니다.

      • 이를 해결하기 위한 간단한 한가지 방법은 이 값이 +Inf이냐 확인 하는 것입니다.

      • 그러나 이러한 체크를 매번 모든 프로그램 하나 하나 코딩 한 줄 한 줄 넣기는 매우 번거롭습니다.

      • 포트란에는 이러한 번거로움을 도와주는 ieee_exceptions 모듈이 내장 되어 있습니다.

      • 간단하게 사용 할 수 있어 프로그램 문서작성에도 코딩내의 간단한 실수도 예방할 수 있습니다.

    PROGRAM exception 
     
      USE, INTRINSIC :: ieee_exceptions, only: & 
      ieee_overflow, ieee_get_flag, ieee_set_halting_mode
    
      IMPLICIT none
    
      REAL :: x, y, z 
      LOGICAL :: overflow_flag = .false.
    
      PRINT *, "Enter values for x and y to be multiplied:" read *, x, y
    
      CALL ieee_set_halting_mode(ieee_overflow, .false.)
    
      z = x * y
    
      CALL ieee_get_flag(ieee_overflow, overflow_flag) 
    
      IF (overflow_flag) THEN 
        PRINT *, "An overflow occurred in the product x*y" 
      ELSE 
        PRINT *, "No overflow occurred in the product x*y" 
      END IF 
    
      PRINT *, " where x = ", x, " and y = ", y  
      PRINT *, "The product was computed as ", z 
    
    END program exception

     

    에러 종류와 예시
    • 에러 종류

      • 포트란에서의 기본적으로 다음과 같은 4가지의 에러 종류가 있습니다.

      • 컴파일 에러

      • 런타임 에러

      • 로직 에러

      • 반올림 에러

     

    • 컴파일 에러

      • 컴파일 에러는 보통 문법이나 선언시의 스펠링 실수 같은 것 들이 프로그램언어에서 기계어로 변환되는 컴파일 과정에 나타납니다.

      • 이 에러가 가장 빈번하게 일어나는 에러 중 한가지 입니다.

      • 컴파일 에러 메세지를 보고 에러처리를 할 경우에 유용하기도 쓸모 없기도 합니다.

      • 가장 일반적으로 발생하는 컴파일 에러 메세지는 다음과 같습니다.

        • dinary errors—the compiler will attempt to continue compilation after one or more of these errors has occurred, IF문에서 ENDIF 가 없을 경우 나타나는 메세지

        • fatal errors-the compiler will not attempt further compilation after detecting a fatal error, 알 수 없는 문자가 있을 경우 나타나는 메세지

        • warnings-these are not strictly errors, but are intended to inform you that you have done something unusual which might cause problems later, IF문 조건이 상수일 경우 혹은 DO문에 제어변수가 정수가 아닐 경우 나타나는 메세지

      •  
    G = 9,8 
     
    ! 소수점(.) 대신 콤마(,)가 찍힘
     
    IF (A = 0) X = 1 
     
    ! "="은 비교논리연산자가 아님
    IF (A == 0) THEN X = 1 !THEN 사용법이 잘 못됨
     
    X = 1 + (2 * 3 
     
    ! 괄호가 빠짐
     
    REAL Y 
    Y = Y + 1 
     
    ! Y가 선언되지 않았다고 에러 나거나 이상한 값이 Y에 할당됨
     
    ! 그 이유는 우변의 Y값이 할당되지 않았기 때문

     

     참고 문헌

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기