간단히 말해서, Python이 저에게 더 편리하기 때문에 제 고문이 저에게 보낸 Fortran77 코드를 Python으로 다시 작성하려고합니다. 내 코드를 테스트하는 동안 내 출력이 Fortran 코드와 약간 다르다는 것을 깨달았습니다. 그리고이 모든 것이 Fortran의 반올림 오류 또는 기타 문제에서 비롯된 것 같습니다.
예를 들어 277./14336.
Python 의 분수 는 다음을 반환합니다.
print(277./14336.)
> 0.019321986607142856
^
그러나 Fortran77에서는 다음을 얻습니다.
program foo
implicit none
real*8 x
x=277./14336.
write(*,*) x
end program
> 1.9321987405419350E-002
^
따라서이 숫자는 일반적으로 충분해야하는 8 번째 유효 숫자까지 동일합니다. 그러나 수치 정확도를 평가하려고 할 때 내 코드 (정확히 10 ^ 8의 순서 1 부분)가 미세 조정 된 취소가 있으므로 Fortran의 오류 추정치는 때때로 Python 코드의 두 배가됩니다.
무슨 일이야? 처음에는 Fortran이 32 비트에서 실행되고 Python이 64 비트에서 실행 되었기 때문이라고 생각했습니다. 하지만 32 비트 버전의 Python을 실행했을 때 동일한 결과를 얻었습니다 (아직 64 비트 OS를 사용하고 있었기 때문에 차이가 있었는지 모르겠습니다) real*8
. Fortran에서 8 바이트 정밀도를 의미한다는 것을 읽었습니다 . 또는 64 비트. Python과 Fortran에서 부동 소수점 숫자의 표현에 근본적인 차이점이 있습니까?
Python의 대답이 더 정확합니다.
Fortran에서는 결과를 64 비트 부동 소수점에 할당하지만 입력은 32 비트 부동 소수점입니다. 따라서 분할은 32 비트 모드에서 수행되고 결과는 할당에서 64 비트로 확장됩니다.
계산에 64 비트 부동 소수점을 사용하면 적절한 결과를 얻을 수 있습니다.
$ cat div.f90
Program div
Use, Intrinsic :: iso_fortran_env, Only : wp => real64
Implicit None
Real( wp ) :: x
x = 277.0_wp / 14336.0_wp
Write( *, * ) x
End Program div
$ gfortran -Wall -Wextra -std=f2008 -fcheck=all div.f90
$ ./a.out
1.9321986607142856E-002
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다