#include <iostream>
#include <cmath>
using namespace std;
struct point //точка
{
double x;
double y;
};
struct straight //прямая в виде общего уравнения Ax + By + C = 0
{
double A;
double B;
double C;
};
straight create_straight (point A, point B)
{
straight s;
s.A = A.y - B.y;
s.B = B.x - A.x;
s.C = A.x * B.y - B.x * A.y;
return s;
}
double r (point A, point B) //расстояние между двумя точками
{
return sqrt((A.x - B.x)*(A.x - B.x)+(A.y - B.y)*(A.y - B.y));
}
point projection (point A, point B, point C) // проекция точки С на прямую AB
{
double x = B.y - A.y; //x и y - координаты вектора, перпендикулярного к AB
double y = A.x - B.x;
double L = (A.x*B.y - B.x*A.y + A.y*C.x - B.y*C.x + B.x*C.y - A.x*C.y)/(x*(B.y - A.y) + y*(A.x - B.x));
point H;
H.x = C.x + x * L;
H.y = C.y + y * L;
return H;
}
point intersection (straight a, straight b) //точка пересечения прямых a и b
{
point ans;
ans.x = (b.C*a.B - a.C*b.B)/(a.A*b.B - b.A*a.B);
ans.y = (a.C*b.A - b.C*a.A)/(b.B*a.A - a.B*b.A);
return ans;
}
void check_projection (point A, point B, point C, double & min_dis)
{
point H = projection(A,B,C);
if ((H.x >= min(A.x,B.x) && H.x <= max(A.x,B.x)) && (H.y >= min(A.y,B.y) && H.y <= max(A.y,B.y))) //проекция принадлежит отрезку
{
if (r(H,C) < min_dis)
{
min_dis = r(H,C);
}
}
}
double distance_if_not_intersect (point A, point B, point C, point D) //расстояние между отрезками, если они не пересекаются
{
double min_dis = min(min(r(A,C),r(A,D)),min(r(B,C),r(B,D)));
check_projection (A,B,C,min_dis);
check_projection (A,B,D,min_dis);
check_projection (C,D,A,min_dis);
check_projection (C,D,B,min_dis);
return min_dis;
}
int main()
{
point A,B,C,D;
cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y;
straight AB = create_straight(A,B);
straight CD = create_straight(C,D);
if (AB.A/CD.A == AB.B/CD.B) //условие паралельности прямых
{
cout<<distance_if_not_intersect(A,B,C,D);
}
else
{
point H = intersection(AB,CD);
if ( (H.x >= min(A.x, B.x) && H.x <= max(A.x,B.x) && H.x >= min(C.x, D.x) && H.x <= max(C.x,D.x)) && //точка пересечения принадлежит обоим отрезкам
(H.y >= min(A.y, B.y) && H.y <= max(A.y,B.y) && H.y >= min(C.y, D.y) && H.y <= max(C.y,D.y)) )
{
cout<<0;
}
else
{
cout<<distance_if_not_intersect(A,B,C,D);
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgcG9pbnQgLy/RgtC+0YfQutCwCnsKCWRvdWJsZSB4OwoJZG91YmxlIHk7Cn07CnN0cnVjdCBzdHJhaWdodCAvL9C/0YDRj9C80LDRjyDQsiDQstC40LTQtSDQvtCx0YnQtdCz0L4g0YPRgNCw0LLQvdC10L3QuNGPIEF4ICsgQnkgKyBDID0gMAp7Cglkb3VibGUgQTsKCWRvdWJsZSBCOwoJZG91YmxlIEM7Cn07CnN0cmFpZ2h0IGNyZWF0ZV9zdHJhaWdodCAocG9pbnQgQSwgcG9pbnQgQikKewoJc3RyYWlnaHQgczsKCXMuQSA9IEEueSAtIEIueTsKCXMuQiA9IEIueCAtIEEueDsKCXMuQyA9IEEueCAqIEIueSAtIEIueCAqIEEueTsKCXJldHVybiBzOwp9CmRvdWJsZSByIChwb2ludCBBLCBwb2ludCBCKSAvL9GA0LDRgdGB0YLQvtGP0L3QuNC1INC80LXQttC00YMg0LTQstGD0LzRjyDRgtC+0YfQutCw0LzQuAp7CglyZXR1cm4gc3FydCgoQS54IC0gQi54KSooQS54IC0gQi54KSsoQS55IC0gQi55KSooQS55IC0gQi55KSk7Cn0KcG9pbnQgcHJvamVjdGlvbiAocG9pbnQgQSwgcG9pbnQgQiwgcG9pbnQgQykgLy8g0L/RgNC+0LXQutGG0LjRjyDRgtC+0YfQutC4INChINC90LAg0L/RgNGP0LzRg9GOIEFCCnsKCWRvdWJsZSB4ID0gQi55IC0gQS55OyAvL3gg0LggeSAtINC60L7QvtGA0LTQuNC90LDRgtGLINCy0LXQutGC0L7RgNCwLCDQv9C10YDQv9C10L3QtNC40LrRg9C70Y/RgNC90L7Qs9C+INC6IEFCCglkb3VibGUgeSA9IEEueCAtIEIueDsKCWRvdWJsZSBMID0gKEEueCpCLnkgLSBCLngqQS55ICsgQS55KkMueCAtIEIueSpDLnggKyBCLngqQy55IC0gQS54KkMueSkvKHgqKEIueSAtIEEueSkgKyB5KihBLnggLSBCLngpKTsKCXBvaW50IEg7CglILnggPSBDLnggKyB4ICogTDsKCUgueSA9IEMueSArIHkgKiBMOwoJcmV0dXJuIEg7Cn0KcG9pbnQgaW50ZXJzZWN0aW9uIChzdHJhaWdodCBhLCBzdHJhaWdodCBiKSAvL9GC0L7Rh9C60LAg0L/QtdGA0LXRgdC10YfQtdC90LjRjyDQv9GA0Y/QvNGL0YUgYSDQuCBiCnsKCXBvaW50IGFuczsKCWFucy54ID0gKGIuQyphLkIgLSBhLkMqYi5CKS8oYS5BKmIuQiAtIGIuQSphLkIpOwoJYW5zLnkgPSAoYS5DKmIuQSAtIGIuQyphLkEpLyhiLkIqYS5BIC0gYS5CKmIuQSk7CglyZXR1cm4gYW5zOwp9CnZvaWQgY2hlY2tfcHJvamVjdGlvbiAocG9pbnQgQSwgcG9pbnQgQiwgcG9pbnQgQywgZG91YmxlICYgbWluX2RpcykKewoJcG9pbnQgSCA9IHByb2plY3Rpb24oQSxCLEMpOwoJaWYgKChILnggPj0gbWluKEEueCxCLngpICYmIEgueCA8PSBtYXgoQS54LEIueCkpICYmIChILnkgPj0gbWluKEEueSxCLnkpICYmIEgueSA8PSBtYXgoQS55LEIueSkpKSAvL9C/0YDQvtC10LrRhtC40Y8g0L/RgNC40L3QsNC00LvQtdC20LjRgiDQvtGC0YDQtdC30LrRgwoJewoJCWlmIChyKEgsQykgPCBtaW5fZGlzKQoJCXsKCQkJbWluX2RpcyA9IHIoSCxDKTsKCQl9Cgl9Cn0KZG91YmxlIGRpc3RhbmNlX2lmX25vdF9pbnRlcnNlY3QgKHBvaW50IEEsIHBvaW50IEIsIHBvaW50IEMsIHBvaW50IEQpIC8v0YDQsNGB0YHRgtC+0Y/QvdC40LUg0LzQtdC20LTRgyDQvtGC0YDQtdC30LrQsNC80LgsINC10YHQu9C4INC+0L3QuCDQvdC1INC/0LXRgNC10YHQtdC60LDRjtGC0YHRjwp7Cglkb3VibGUgbWluX2RpcyA9IG1pbihtaW4ocihBLEMpLHIoQSxEKSksbWluKHIoQixDKSxyKEIsRCkpKTsKCWNoZWNrX3Byb2plY3Rpb24gKEEsQixDLG1pbl9kaXMpOwoJY2hlY2tfcHJvamVjdGlvbiAoQSxCLEQsbWluX2Rpcyk7CgljaGVja19wcm9qZWN0aW9uIChDLEQsQSxtaW5fZGlzKTsKCWNoZWNrX3Byb2plY3Rpb24gKEMsRCxCLG1pbl9kaXMpOwoJcmV0dXJuIG1pbl9kaXM7Cn0KaW50IG1haW4oKQp7Cglwb2ludCBBLEIsQyxEOwoJY2luPj5BLng+PkEueT4+Qi54Pj5CLnk+PkMueD4+Qy55Pj5ELng+PkQueTsKCXN0cmFpZ2h0IEFCID0gY3JlYXRlX3N0cmFpZ2h0KEEsQik7CglzdHJhaWdodCBDRCA9IGNyZWF0ZV9zdHJhaWdodChDLEQpOwoJaWYgKEFCLkEvQ0QuQSA9PSBBQi5CL0NELkIpIC8v0YPRgdC70L7QstC40LUg0L/QsNGA0LDQu9C10LvRjNC90L7RgdGC0Lgg0L/RgNGP0LzRi9GFCgl7CgkJY291dDw8ZGlzdGFuY2VfaWZfbm90X2ludGVyc2VjdChBLEIsQyxEKTsKCX0KCWVsc2UKCXsKCQlwb2ludCBIID0gaW50ZXJzZWN0aW9uKEFCLENEKTsKCQlpZiAoIChILnggPj0gbWluKEEueCwgQi54KSAmJiBILnggPD0gbWF4KEEueCxCLngpICYmIEgueCA+PSBtaW4oQy54LCBELngpICYmIEgueCA8PSBtYXgoQy54LEQueCkpICYmIC8v0YLQvtGH0LrQsCDQv9C10YDQtdGB0LXRh9C10L3QuNGPINC/0YDQuNC90LDQtNC70LXQttC40YIg0L7QsdC+0LjQvCDQvtGC0YDQtdC30LrQsNC8CgkJKEgueSA+PSBtaW4oQS55LCBCLnkpICYmIEgueSA8PSBtYXgoQS55LEIueSkgJiYgSC55ID49IG1pbihDLnksIEQueSkgJiYgSC55IDw9IG1heChDLnksRC55KSkgKQoJCXsKCQkJY291dDw8MDsKCQl9CgkJZWxzZQoJCXsKCQkJY291dDw8ZGlzdGFuY2VfaWZfbm90X2ludGVyc2VjdChBLEIsQyxEKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==