minpack
Fortran77 라이브러리를 Java 로 다시 작성하려고 하므로 minpack.f
소스 코드 에서 이것을 만났습니다 .
integer mcheps(4)
integer minmag(4)
integer maxmag(4)
double precision dmach(3)
equivalence (dmach(1),mcheps(1))
equivalence (dmach(2),minmag(1))
equivalence (dmach(3),maxmag(1))
...
data dmach(1) /2.22044604926d-16/
data dmach(2) /2.22507385852d-308/
data dmach(3) /1.79769313485d+308/
dpmpar = dmach(i)
return
무엇 minmag
과 maxmag
기능, 그리고 왜 dmach(2)
하고 dmach(3)
이 값이? 주석에 설명이 있습니다.
c dpmpar(1) = b**(1 - t), the machine precision,
c dpmpar(2) = b**(emin - 1), the smallest magnitude,
c dpmpar(3) = b**emax*(1 - b**(-t)), the largest magnitude.
가장 작은 크기와 가장 큰 크기는 무엇입니까? 런타임에 이러한 값을 계산하는 방법이 있어야합니다. 소스 코드의 기계 상수는 잘못된 스타일입니다.
편집 : 정적 필드 Double.MIN_VALUE
와 Double.MAX_VALUE
내가 찾던 값 이라고 가정합니다 .
minmag
그리고 maxmag
( mcheps
또한) 함수가 아니며 각각 4 개의 요소가있는 순위 1 정수 배열로 선언됩니다. 마찬가지로 dmach
배정 밀도 값의 순위 1 3 요소 배열입니다. 각 정수 값은 4 바이트를 차지하고 각 dp 값은 8 바이트를 차지할 가능성이 높지만 확실하지는 않습니다. 답변이 진행됨에 따라이를 염두에 두십시오.
따라서과 같은 표현식 mcheps(1)
은 함수 호출이 아니라 배열의 첫 번째 요소에 대한 참조입니다.
equivalence
는 오래된 FORTRAN 기능으로, 이제 언어 표준과 소프트웨어 엔지니어링 관행에 의해 사용되지 않습니다. 다음과 같은 진술
equivalence (dmach(1),mcheps(1))
의 첫 번째 요소가의 첫 번째 요소 dmach
와 동일한 주소에있는 메모리에 있음을 나타 mcheps
냅니다. 함축적으로 이것은 또한의 24 바이트가 dmach
의 16 바이트와 동일한 주소를 차지하고 mcheps
또 다른 8 바이트도 차지 한다는 것을 의미합니다 . 무슨 일이 일어나고 있는지 그림을 그리도록 남겨 두겠습니다. 코드는 원래 (아마도 여전히) 8 바이트 정수를 사용하여 등가 배열의 요소가 1 : 1과 일치하도록 할 수 있습니다.
참고 equivalence
동일한 메모리 위치에, 본질적으로, 하나 이상의 이름, 하나 개 이상의 해석을 제공합니다. mcheps(1)
에 대한 저장소의 일부를 구성하는 4 바이트 메모리에 저장된 정수의 이름입니다 dmach(1)
. 등가 화는 모든 바이트가 소중했던 시대에 모든 종류의 '영리한'트릭을 구현하는 데 사용되었습니다.
그런 다음 data
문은의 요소에 값을 할당합니다 dmach
. 나에게 이러한 가치는 댓글이 우리에게 말하는 것과 같습니다.
편집 : 주석은 해당 크기가 코드가 마지막으로 컴파일 된 플랫폼에서 표현 가능한 최소 및 최대 배정 밀도 숫자임을 나타냅니다. Java에서는 아마도 doubles
. 나는 자바를 모르기 때문에 가장 크고 가장 작은 두 배의 가치를 반환하기 위해 어떤 시설이 있는지 모르겠다. 만약 당신이 이것이 '네트를 쳤거나 다른 SO 질문을 할 것이다. 아마도 인터넷 검색 라인을 따라 응답을 얻을 수 있습니다.
이것의 대부분은 완전히 무시할 수 있어야합니다. 작성할 때 더 나은 접근 방식은 내장 함수를 사용하여 쿼리를 통해 런타임에 해당 값을 찾는 것입니다. Fortran 90 (및 이후 버전)에는 이러한 기능이 있습니다. Java도 있다고 생각하지만 그것은 내 도메인이 아닙니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다