#include <iostream>
#include <stdio.h>
#include <vector>
#include <math.h>
#include <algorithm>


using namespace std;


#define EPS (1e-10)
#define equals(a,b) (fabs((a) - (b)) < EPS) //?????????????????????????????????

//??????p0,p1,p2????????????
#define COUNTER_CLOCKWISE 1 //???????????§???????¨????????????´???
#define CLOCKWISE  -1 //???????????§????¨????????????´???
#define ONLINE_BACK 2 //p2,p0,p1??????????????§????????´?????????????????¨???
#define ONLINE_FRONT -2//???????????§????????´?????????????????¨???
#define ON_SEGMENT 0 //p2?????????p0 p1??????????????¨???


//??????????????????????????????
class Point {

public:

	double x, y;//??§?¨????????????????x,y??????

	Point(double x = 0, double y = 0) :x(x), y(y) {}

	Point operator + (Point p) {
		return Point(x + p.x, y + p.y);
	}

	Point operator - (Point p) {
		return Point(x - p.x, y - p.y);
	}

	Point operator * (double r) {
		return Point(x * r, y * r);
	}

	Point operator / (double r) {
		return Point(x / r, y / r);
	}

	double norm() {
		return x*x + y*y;
	}

	//?????????????????§???????????????
	double abs() {
		return sqrt(norm());
	}

	bool operator < (const Point &p) const {
		return x != p.x ? x < p.x : y < p.y;
	}

	bool operator == (const Point &p) const {
		return fabs(x - p.x) < EPS &&  fabs(y - p.y) < EPS;
	}

};

typedef Point Vector;

//??????????????????????????????
double dot(Vector a, Vector b) {
	return a.x * b.x + a.y * b.y;
}

//??????????????????????????????
double cross(Vector a, Vector b) {
	return a.x * b.y - a.y * b.x;
}



class Segment {
public:
	Point p1, p2;

	Segment() {}

	//?????¨????°???±?????????
	Point projection(Point p) {
		Vector base = p2 - p1;

		double r = dot(p - p1, base) / base.norm();
		return p1 + base * r;
	}

	//????°??????????
	Point reflection(Point p) {
		return p + (projection(p) - p)*2.0;
	}


};


typedef Segment Line;

typedef vector<Point> Polygon;


//?????????????????´?????????
bool isOrthogonal(Vector a, Vector b);

//??????????§??????¨?????????????????´?????????
bool isOrthogonal(Point a1, Point a2, Point b1, Point b2);

//???????????´?????????
bool isOrthogonal(Segment s1, Segment s2);

//???????????????????????????
bool isParallel(Vector a, Vector b);

//??????????§??????¨???????????????????????????
bool isParallel(Point a1, Point a2, Point b1, Point b2);

//?????????????????????
bool isParallel(Segment s1, Segment s2);

//?°???±?????????
Point projection(Segment s, Point p);

//????°??????????
Point reflection(Segment s, Point p);

//2??????????????¢?????????
double getDistance(Point a, Point b);

//??´?????¨???????????¢?????????
double getDistanceLP(Line l, Point p);

//????????¨???????????¢?????????
double getDistanceSP(Segment s, Point p);

//??????s1??¨??????s2????????¢?????????
double getDistance(Segment s1, Segment s2);


//???????????¢????????????
int ccw(Point p0, Point p1, Point p2);

//??????p1p2??¨??????p2p3???????????????
bool intersect(Point p1, Point p2, Point p3, Point p4);

//??????s1??¨??????s2???????????????
bool intersect(Segment s1, Segment s2);



//?????????????????´?????????
bool isOrthogonal(Vector a, Vector b) {
	return equals(dot(a, b), 0.0);
}

//??????????§??????¨?????????????????´?????????
bool isOrthogonal(Point a1, Point a2, Point b1, Point b2) {
	return isOrthogonal(a1 - a2, b1 - b2);
}

//???????????´?????????
bool isOrthogonal(Segment s1, Segment s2) {
	return equals(dot(s1.p2 - s1.p1, s2.p2 - s2.p1), 0.0);
}

//???????????????????????????
bool isParallel(Vector a, Vector b) {
	return equals(cross(a, b), 0.0);
}

//??????????§??????¨???????????????????????????
bool isParallel(Point a1, Point a2, Point b1, Point b2) {
	return isParallel(a1 - a2, b1 - b2);
}

//?????????????????????
bool isParallel(Segment s1, Segment s2) {
	return equals(cross(s1.p2 - s1.p1, s2.p2 - s2.p1), 0.0);
}

//?°???±?????????
Point projection(Segment s, Point p) {
	Vector base = s.p2 - s.p1;
	double r = dot(p - s.p1, base) / base.norm();
	return s.p1 + base * r;
}

//????°??????????
Point reflection(Segment s, Point p) {
	return p + (projection(s, p) - p)*2.0;
}

//2??????????????¢?????????
double getDistance(Point a, Point b) {
	return (a - b).abs();
}

//??´?????¨???????????¢?????????
double getDistanceLP(Line l, Point p) {
	return fabs(cross(l.p2 - l.p1, p - l.p1) / (l.p2 - l.p1).abs());
}

//????????¨???????????¢?????????
double getDistanceSP(Segment s, Point p) {
	if (dot(s.p2 - s.p1, p - s.p1) < 0.0) {
		return (p - s.p1).abs();
	}
	if (dot(s.p1 - s.p2, p - s.p2) < 0.0) {
		return (p - s.p2).abs();
	}

	return getDistanceLP(s, p);
}

//??????s1??¨??????s2????????¢?????????
double getDistance(Segment s1, Segment s2) {

	if (intersect(s1, s2)) {
		return 0.0;
	}
	return min(min(getDistanceSP(s1,s2.p1), getDistanceSP(s1, s2.p2)),min(getDistanceSP(s2, s1.p1), getDistanceSP(s2, s1.p2)));
}


//???????????¢????????????
int ccw(Point p0, Point p1, Point p2) {
	Vector a = p1 - p0;
	Vector b = p2 - p0;

	if (cross(a, b) > EPS) {//???????¨?????????????
		return COUNTER_CLOCKWISE;
	}
	if (cross(a, b) < -EPS) {//????¨?????????????
		return CLOCKWISE;
	}
	if (dot(a, b) < -EPS) {//p2,p0,p1??????????????§????????´?????????????????????
		return ONLINE_BACK;
	}
	if (a.norm() < b.norm()) {//p0,p1,p2??????????????§????????´?????????????????????
		return ONLINE_FRONT;
	}

	return ON_SEGMENT;//??????p0 p1??????p2???????????????

}

//??????p1p2??¨??????p2p3???????????????
bool intersect(Point p1, Point p2, Point p3, Point p4) {
	return ccw(p1, p2, p3) * ccw(p1, p2, p4) <= 0 && ccw(p3, p4, p1) * ccw(p3, p4, p2) <= 0;
}

//??????s1??¨??????s2???????????????
bool intersect(Segment s1, Segment s2) {
	return intersect(s1.p1,s1.p2,s2.p1,s2.p2);
}







//???
class Circle {
public:
	Point c;//??????
	double r;//??????
	Circle(Point c = Point(), double r = 0.0) :c(c), r(r) {}
};


int main(void)
{
	int n;

	Segment s1;
	Segment s2;


	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> s1.p1.x >> s1.p1.y >> s1.p2.x >> s1.p2.y;
		cin >> s2.p1.x >> s2.p1.y >> s2.p2.x >> s2.p2.y;

		printf("%.9lf\n",getDistance(s1,s2));

	}



	return 0;
}

Measured memory_bytes: 3184