typedef complex<double> P;
#define X real()
#define Y imag()
double dot(P a, P b){
return (a * conj(b)).X;
}
double cross(P a, P b){
return (a * conj(b)).Y;
}
int ccw(P a, P b, P c){
b -= a;
c -= a;
if(cross(b, c) > 0) return +1;
if(cross(b, c) < 0) return -1;
if(dot(b, c) < 0) return +2;
if(norm(b) < norm(c)) return -2;
return 0;
}
double dist(P a, P b){
return abs(a - b);
}
bool intersectSS(const vector<P> &a, const vector<P> &b){
return ccw(a[0], a[1], b[0]) * ccw(a[0], a[1], b[1]) <= 0 &&
ccw(b[0], b[1], a[0]) * ccw(b[0], b[1], a[1]) <= 0;
}
bool solve(){
vector<P> a(2), b(2);
rep(i, 2) cin >> a[i].X >> a[i].Y;
if(a[0] == P(0, 0) && a[1] == P(0, 0)) return false;
rep(i, 2) cin >> b[i].X >> b[i].Y;
if(intersectSS(a, b)){
double mn = INF;
rep(i, 2) mineq(mn, dist(a[0], b[i]) + dist(a[1], b[i]));
cout << mn/2 << endl;
}else{
cout << dist(a[0], a[1])/2 << endl;
}
return true;
}