2017-11-16 10 views
1

내 코드에서 변수 정밀도에 문제가 있습니다 ... 잠시 동안 변수를 real(kind=8) :: var으로 선언했는데 이제는 이식성이 좋지 않고 다른 몇 가지 합병증이 있음을 이해합니다. ,하지만 기본적으로 나는 수치 계산에서 많은 부정확성을 얻고있다. 나는 보통 var1 = 1.0D0으로 변수를 초기화Fortran에서 지수 정의

INTEGER, PARAMETER :: R8 = SELECTED_REAL_KIND (30, 300) 
with variable declaration: real(R8) :: var1,var2. 

전에 지금은 var1 = 1.0_R8을 사용하고 있지만 내가 var1 = 1.0D-20을 어떻게해야 : 이제

내가 사용하고 있는데? 1.0D-20이 정확한 결과를주지 못하지만, 10.0_r8**(-20.0_r8)과 같은 것을 알 수있는 간단한 코드를 실행했습니다. 변수를 정의하는 더 쉬운 방법이 있습니까? 나는 1D-20이 매우 작다는 것을 알고 있지만, 실제로 사용하고있는 코드는 십진수 30 자의 정밀도가 필요합니다.

도움 주셔서 감사합니다.

+2

모두 사용해보십시오 : 아니 정말 중요한 것을 1.0E-20_r8 –

+1

을 하지만 'r8'을 사용하면 아마 16이라는 값을 누군가에게 혼동을 줄 수 있습니다. – agentp

+0

글쎄,'r8' 쿼드가 실제로 문제가 실제로 드러나는 유일한 이유입니다. – Ross

답변

1

실제로 여기서 두 가지 일이 발생합니다. 먼저 d 표기법을 사용하여 지수를 선언하는 것은 유형을 double precision으로 선언하는 것과 같습니다.

두 번째로, 선언 한 변수 r8은 대부분의 (모든?) 8 바이트 표현보다 정밀도가 필요합니다. 따라서 인데 실제로 변수를 쿼드로 선언 한 다음 문제의 원인 인 double로 초기화합니다. 코멘트에서 언급 한 바와 같이

은 사용자의 명시 적 질문에 대한 답은 다음과 같은 표기

real(mytype) :: a = 1.23e-20_mytype 

이 표기법 상수 선언에 익숙해 복잡하지만, 쉽게를 사용하여 지수를 선언하는 것입니다. 여기

내가 당신의 유형을 테스트하는 데 약간의 샘플 코드입니다 : 인텔 16.0에 대한

program main 
    use ISO_FORTRAN_ENV, only : REAL64 => REAL64, REAL128 
    implicit none 

    INTEGER, PARAMETER :: R8 = SELECTED_REAL_KIND (30, 300) 
    real(r8) :: x, y, z 
    real(REAL64) :: a, b, c 

    x = 1.23d-20 
    y = 1.23e-20_r8 
    z = 1.23_r8*(10._r8**-20) 

    write(*,*) x 
    write(*,*) y 
    write(*,*) z 


    a = 1.23d-20 
    b = 1.23e-20_REAL64 
    c = 1.23_REAL64*(10._REAL64**-20) 

    write(*,*) a 
    write(*,*) b 
    write(*,*) c 

    write(*,*) 'Types: ', REAL64, R8, REAL128 

end program main 

을,이 제공 :

mach5% ifort main.f90 && ./a.out 
    1.230000000000000057423043720037598E-0020 
    1.230000000000000000000000000000000E-0020 
    1.230000000000000000000000000000002E-0020 
    1.230000000000000E-020 
    1.230000000000000E-020 
    1.230000000000000E-020 
Types:   8   16   16 
+0

좋은 지적 @francescalus - 나는'double precision'이 표준의 공식적인 부분이라는 것을 깨닫지 못했습니다. 나는 그것을 kind = 8로 혼동하고 있었다고 생각한다. – Ross

+0

그래,하지만 현재의 컨텍스트에서 명확하지 않았고 답은 아무런 언급없이 더 낫다. – Ross