Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
doubleprecision | :: | x | ||||
integer | :: | len | ||||
integer | :: | maxd | ||||
doubleprecision | :: | a | ||||
doubleprecision | :: | b | ||||
doubleprecision | :: | d(len) |
subroutine mat_rat(x,len,maxd,a,b,d) ! ident_39="@(#)M_LA::mat_rat(3fp): A/B = continued fraction approximation to X using len terms each less than MAXD" integer :: len,maxd doubleprecision :: x,a,b,d(len) doubleprecision :: s,t,z integer :: i integer :: ib integer :: k z = x k=0 ! preset to illegal value if(len.lt.1)then write(*,*)'*mat_rat* internal error -- len<1' return endif do i = 1, len k = i d(k) = mat_round(z) z = z - d(k) if (dabs(z)*dble(maxd) .le. 1.0d0) exit z = 1.0d0/z enddo t = d(k) s = 1.0d0 if (k .ge. 2) then do ib = 2, k i = k+1-ib z = t t = d(i)*t + s s = z enddo endif if (s .lt. 0.0d0) t = -t if (s .lt. 0.0d0) s = -s a = t b = s end subroutine mat_rat