포트란에서 배정도 값을 설정하는 방법


10

최근에 FORTRAN95에 이상한 문제가 발생했습니다. 변수 X와 Y를 다음과 같이 초기화했습니다.

X=1.0
Y=0.1

나중에 함께 추가하고 결과를 인쇄합니다.

1.10000000149012

변수를 검토 한 후 0.1이 완전 정밀도로 배정 밀도로 표현되지 않은 것처럼 보입니다. 이것을 피할 수있는 방법이 있습니까?

답변:


21

이를 수행하는 또 다른 방법은 먼저 SELECTED_REAL_KIND 내장 함수를 사용하여 변수에 원하는 정밀도를 명시 적으로 지정한 다음이를 사용하여 변수를 정의하고 초기화하는 것입니다. 다음과 같은 것 :

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

이 방법으로 얻을 수있는 좋은 장점 dp은 모듈에 정의를 저장 한 다음 USE필요한 경우 해당 모듈 에 저장할 수 있다는 것 입니다. 이제 프로그램의 정밀도를 변경하려면 변수 초기화가 끝날 때 dp모든 D0s를 검색하고 바꾸는 대신 한곳에서 정의를 변경하면됩니다 . (이것은 또한 1.0D-1Y를 제안 된대로 정의하기 위해 구문을 사용하지 않는 것이 좋습니다 . 작동하지만 나중에 모든 인스턴스를 찾고 변경하기가 어렵습니다.)

Fortran Wiki 의이 페이지는 에 대한 추가 정보를 제공 SELECTED_REAL_KIND합니다.


맞습니다. 이것이 표준 접근법이어야합니다.
Ondřej Čertík

그리고 어쨌든 절차와 테스트로 절차를 거치지 않고 사람들이 얼마나 자주 프로그램의 정확성을 맹목적으로 바꾸어야합니까? 이 _dp체계 를 사용하는 주된 이유 는 정밀도가 휴대용으로 명확하게 정의되기 때문입니다.
ja72

12

변수를 배정도로 선언했지만 단 정밀도 값으로 변수를 초기화했습니다.

당신은 쓸 수 있습니다 :

X=1.0d0
Y=1.0d-1

아래 의 Barron의 대답 은 리터럴 배정도를 만드는 또 다른 방법이며 나중에 변수의 정밀도를 변경할 수 있다는 이점이 있습니다.


1
아래 게시물에 설명 된 1.0_dp 방법을 사용해야한다고 생각합니다.
Ondřej Čertík

1
두 번째 @ OndřejČertík의 의견-Barron의 답변이 가장 좋습니다.
OscarB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.