type angle=real;
point=record
x,y:real;
end;
line2p=record
p1,p2:point
end;
function atan2(dy,dx:real):real;
begin
if dx=0 then
begin
if dy>=0 then atan2:=pi/2 else atan2:=-pi/2;
end
else
begin
if dx>0 then atan2:=arctan(dy/dx)
else
if dy>=0 then atan2:=pi+arctan(dy/dx)
else atan2:=-pi+arctan(dy/dx);
end;
end;
function asin2(a,c:real):angle;
var b:real;
begin
if c*c<=a*a then
begin
if a>0 then asin2:=pi/2
else asin2:=-pi/2;
end
else
begin
b:=sqrt(c*c-a*a);
asin2:=atan2(a,b);
end;
end;
function vprod(l1,l2:line2P):real;
var dx1,dy1,dx2,dy2:real;
begin
dx1:=l1.p2.x-l1.p1.x;
dy1:=l1.p2.y-l1.p1.y;
dx2:=l2.p2.x-l2.p1.x;
dy2:=l2.p2.y-l2.p1.y;
vprod:=dx1*dy2-dx2*dy1
end;
function dprod(l1,l2:line2P):real;
var dx1,dy1,dx2,dy2:real;
begin
dx1:=l1.p2.x-l1.p1.x;
dy1:=l1.p2.y-l1.p1.y;
dx2:=l2.p2.x-l2.p1.x;
dy2:=l2.p2.y-l2.p1.y;
dprod:=dx1*dx2+dy1*dy2
end;
function dist(p1,p2:point):real;
var dx,dy:real;
begin
dx:=p2.x-p1.x;
dy:=p2.y-p1.y;
dist:=sqrt(dx*dx+dy*dy);
end;
function AngleBtw2lines(l1,l2:line2P):real;
var b,a,e,d1,d2:real; l:line2p;
begin
b:=vprod(l1,l2);
d1:=dist(l1.p1,l1.p2);
d2:=dist(l2.p1,l2.p2);
if d1=0 then
begin
writeln('d1=0');
readln;
halt;
end;
if d2=0 then
begin
writeln('d2=0');
readln;
halt;
end;
e:=b/d1/d2;
a:=abs(asin2(e,1));
if dprod(l1,l2)<0 then a:=pi-a;
AngleBtw2lines:=a;
end;