2014-07-15 2 views
0

간단한 질문입니다. 비슷한 질문이 있었지만, 내가 찾고있는 정확한 것을 얻지 못했습니다.실제 데이터 형식 fortran 90

Fortran 90 (ifort 컴파일러 사용)에서 실제 데이터 유형의 한계를 확인하고 있었기 때문에 실제 코드가 그 한계에 도달 할 수 있습니다. 테스트하기 위해 매개 변수 mval1 (코드 참조)에 2를 곱합니다. ifort 설명서에 취할 수있는 최대 값은 10E38이고 내 값은 이보다 훨씬 작습니다. 그러나 인쇄하는 동안 끝까지 무작위 숫자를 사용합니다 (출력은 하단에 표시됨). 사람이 이미 했어 해설에 추가하려면이

PROGRAM TEST 

    IMPLICIT NONE 
    REAL(KIND=8), PARAMETER :: mval1 = 1073E12 
    REAL(KIND=8) :: j 
    j = real(2*mval1) 
    PRINT *, j,mval1 

END PROGRAM TEST 

출력을 통해

2.146000005234688E+015 1.073000002617344E+015 
+1

부동 소수점 숫자와 관련된 정밀도의 손실이 나타납니다. [here] (http://floating-point-gui.de/) 또는 [여기] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) –

+0

인텔 컴파일러 설명서 그것은 실제 (종류 = 8)에 대해 15-17 십진 정밀도를 말하는 것입니다. 나는 9 번째 자리를보고 있는데 여전히 작동하지 않는다 – Vaidyanathan

+1

[부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

답변

3

두 점을 도와 수 없습니다.

1 : 인텔 포트란 real(kind=8)의 변수는 IEEE-754 배정도 숫자와 같으며 최대 양수는 1.797693134862316E+308입니다. 단정도 IEEE 부동 소수점 숫자 인 Intel Fortran real(kind=4)의 경우 최대 값은 3.4028235E+38이며 약 10E38입니다.

2 : 귀하의 선언

REAL(KIND=8), PARAMETER :: mval1 = 1073E12 

mval1 기본적 실제 종류의 값을 할당합니다. 나는 기본 컴파일러 설정이 무엇인지 알고 있지만 명시 적으로 문자가 kind=8의 함을 선언합니다

REAL(KIND=8), PARAMETER :: mval1 = 1073E12_8 

에 그 라인을 변경하면 어떻게되는지 확인하지 않습니다.

당신이 묻지 않는 질문에 대한 대답과 다른 의견으로는별로 알려지지 않은 점은 부동 소수점 연산이 까다 롭고이를 사용하는 프로그래머가 최소한 기본 속임수. Wikipedia article on floating-point 숫자와 산술은 자기 교육을위한 좋은 출발점입니다. 다른 사람들이 Goldberg의 논문을 무시한다고 말하든간에 자신의 부동 소수점 숫자와 산술을 구현하기 시작할 때까지 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 내용은입니다.

+0

FYI : 각 게시물의 편집 내역에 롤백 링크가 있습니다. . –