|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 3072 (0xc00) Types: TextFile Names: »tdiag«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦09b4e9619⟧ »thcømat« └─⟦this⟧
\f message diag diag=algol message.no external boolean procedure diag(n,z,d); value n; integer n; array z,d; begin integer i,j,k,l,m; real f,g,h,hh,b,c,p,r,s; array e(1:n); for i:= n step -1 until 2 do begin l:= i-2; f:= z(i,i-1); g:= 0; for k:= 1 step 1 until l do g:= g+z(i,k)**2; h:= g+f*f; if g<=2**(-2014) then begin e(i):= f; h:= 0 end else begin l:= l+1; g:= e(i):= if f>=0 then -sqrt(h) else sqrt(h); h:= h-f*g; z(i,i-1):= f-g; f:= 0; for j:= 1 step 1 until l do begin z(j,i):= z(i,j)/h; g:= 0; for k:= 1 step 1 until j do g:= g+z(j,k)*z(i,k); for k:= j+1 step 1 until l do g:= g+z(k,j)*z(i,k); e(j):= g/h; f:= f+g*z(j,i) end; hh:= f/(h+h); for j:= 1 step 1 until l do begin f:= z(i,j); g:= e(j):= e(j)-hh*f; for k:= 1 step 1 until j do z(j,k):= z(j,k)-f*e(k)-g*z(i,k) end end; d(i):= h end; d(1):= e(1):= 0; for i:= 1 step 1 until n do begin l:= i-1; if d(i)<>0 then for j:= 1 step 1 until l do begin g:= 0; for k:= 1 step 1 until l do g:= g+z(i,k)*z(k,j); for k:= 1 step 1 until l do z(k,j):= z(k,j)-g*z(k,i) end; d(i):= z(i,i); z(i,i):= 1; for j:= 1 step 1 until l do z(i,j):= z(j,i):= 0 end; for i:= 2 step 1 until n do e(i-1):= e(i); e(n):= b:= f:= 0; for l:= 1 step 1 until n do begin h:= 2**(-35)*(abs(d(l))+abs(e(l))); if b<h then b:= h; for m:= l step 1 until n do if abs(e(m))<=b then goto cont; cont: if m<>l then begin for j:= 0,j+1 while abs(e(l))>b do begin if j=30 then begin diag:= false; goto error end; p:= (d(l+1)-d(l))/(2*e(l)); r:= sqrt(p**2+1); h:= d(l)-e(l)/(if p<0 then p-r else p+r); for i:= l step 1 until n do d(i):= d(i)-h; f:= f+h; p:= d(m); c:= 1; s:= 0; for i:= m-1 step -1 until l do begin g:= c*e(i); h:= c*p; if abs(p)>=abs(e(i)) then begin c:= e(i)/p; r:= sqrt(c**2+1); e(i+1):= s*p*r; s:= c/r; c:= 1/r end else begin c:= p/e(i); r:= sqrt(c**2+1); e(i+1):= s*e(i)*r; s:= 1/r; c:= c/r end; p:= c*d(i)-s*g; d(i+1):= h+s*(c*g+s*d(i)); for k:= 1 step 1 until n do begin h:= z(k,i+1); z(k,i+1):= s*z(k,i)+c*h; z(k,i):= c*z(k,i)-s*h end end; e(l):= s*p; d(l):= c*p; end end; d(l):= d(l)+f end; for i:= 1 step 1 until n do begin k:= i; p:= d(i); for j:= i+1 step 1 until n do if d(j)<p then begin k:= j; p:= d(j) end; if k<>i then begin d(k):= d(i); d(i):= p; for j:= 1 step 1 until n do begin p:= z(j,i); z(j,i):= z(j,k); z(j,k):= p end end end; diag:= true; error: end diag ; end ▶EOF◀