#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define MOD 1000000007
#define sz 200005
using namespace std;
typedef long double T;
const double eps = 1e-9;
const double PI = acos((double) - 1.0);
int sign(double x) { return (x > eps) - (x < -eps); }
struct PT {
double x, y;
PT() { x = 0, y = 0; }
PT(double x, double y) : x(x), y(y) {}
PT(const PT &p) : x(p.x), y(p.y) {}
PT operator + (const PT &a) const { return PT(x + a.x, y + a.y); }
PT operator - (const PT &a) const { return PT(x - a.x, y - a.y); }
PT operator * (const double a) const { return PT(x * a, y * a); }
friend PT operator * (const double &a, const PT &b) { return PT(a * b.x, a * b.y); }
PT operator / (const double a) const { return PT(x / a, y / a); }
bool operator == (PT a) const { return sign(a.x - x) == 0 && sign(a.y - y) == 0; }
bool operator != (PT a) const { return !(*this == a); }
bool operator < (PT a) const { return sign(a.x - x) == 0 ? y < a.y : x < a.x; }
bool operator > (PT a) const { return sign(a.x - x) == 0 ? y > a.y : x > a.x; }
double norm() { return sqrt(x * x + y * y); }
double norm2() { return x * x + y * y; }
PT perp() { return PT(-y, x); }
double arg() { return atan2(y, x); }
PT truncate(double r) { // returns a vector with norm r and having same direction
double k = norm();
if (!sign(k)) return *this;
r /= k;
return PT(x * r, y * r);
}
};
template <typename T> int sgn(T x) {
return (T(0) < x) - (x < T(0));
}
istream &operator >> (istream &in, PT &p) { return in >> p.x >> p.y; }
ostream &operator << (ostream &out, PT &p) { return out << "(" << p.x << "," << p.y << ")"; }
inline double dot(PT a, PT b) { return a.x * b.x + a.y * b.y; }
inline double dist2(PT a, PT b) { return dot(a - b, a - b); }
inline double dist(PT a, PT b) { return sqrt(dot(a - b, a - b)); }
inline double cross(PT a, PT b) { return a.x * b.y - a.y * b.x; }
inline double cross2(PT a, PT b, PT c) { return cross(b - a, c - a); }
// find a point from a through b with distance d
PT point_along_line(PT a, PT b, double d) {
assert(a != b);
return a + (((b - a) / (b - a).norm()) * d);
}
// minimum distance from point c to line through a and b
double dist_from_point_to_line(PT a, PT b, PT c) {
return fabs(cross(b - a, c - a) / (b - a).norm());
}
void Solve()
{
T x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
PT TS(x1, y1);
PT TG(x2, y2);
cin >> x1 >> y1 >> x2 >> y2;
PT AS(x1, y1);
PT AG(x2, y2);
T lo = 0.0, hi = max(dist(TS, TG), dist(AS, AG)), mid1, mid2, res = 1e9;
while (hi - lo > 0.0000001)
{
mid1 = lo + (hi - lo) / 3.0;
mid2 = hi - (hi - lo) / 3.0;
PT x = point_along_line(TS, TG, mid1);
PT y = point_along_line(AS, AG, mid1);
if (mid1 > dist(TS, TG))
x = TG;
if (mid1 > dist(AS, AG))
y = AG;
T c1 = dist(x, y);
x = point_along_line(TS, TG, mid2);
y = point_along_line(AS, AG, mid2);
if (mid2 > dist(TS, TG))
x = TG;
if (mid2 > dist(AS, AG))
y = AG;
T c2 = dist(x, y);
if (c1 < c2 + eps)
{
res = c1;
hi = mid2;
}
else {
res = c2;
lo = mid1;
}
}
cout << fixed << setprecision(6) << res << endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t, T = 1;
cin >> T;
for (t = 1; t <= T; t++)
Solve();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZwojZGVmaW5lIGVuZGwgICAgICAgICAgICAgICAgJ1xuJwojZGVmaW5lIE1PRCAgICAgICAgICAgICAgICAgMTAwMDAwMDAwNwojZGVmaW5lIHN6ICAgICAgICAgICAgICAgICAgMjAwMDA1CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgZG91YmxlIFQ7CmNvbnN0IGRvdWJsZSBlcHMgPSAxZS05Owpjb25zdCBkb3VibGUgUEkgPSBhY29zKChkb3VibGUpIC0gMS4wKTsKaW50IHNpZ24oZG91YmxlIHgpIHsgcmV0dXJuICh4ID4gZXBzKSAtICh4IDwgLWVwcyk7IH0KCnN0cnVjdCBQVCB7CiAgICBkb3VibGUgeCwgeTsKICAgIFBUKCkgeyB4ID0gMCwgeSA9IDA7IH0KICAgIFBUKGRvdWJsZSB4LCBkb3VibGUgeSkgOiB4KHgpLCB5KHkpIHt9CiAgICBQVChjb25zdCBQVCAmcCkgOiB4KHAueCksIHkocC55KSAgICB7fQogICAgUFQgb3BlcmF0b3IgKyAoY29uc3QgUFQgJmEpIGNvbnN0IHsgcmV0dXJuIFBUKHggKyBhLngsIHkgKyBhLnkpOyB9CiAgICBQVCBvcGVyYXRvciAtIChjb25zdCBQVCAmYSkgY29uc3QgeyByZXR1cm4gUFQoeCAtIGEueCwgeSAtIGEueSk7IH0KICAgIFBUIG9wZXJhdG9yICogKGNvbnN0IGRvdWJsZSBhKSBjb25zdCB7IHJldHVybiBQVCh4ICogYSwgeSAqIGEpOyB9CiAgICBmcmllbmQgUFQgb3BlcmF0b3IgKiAoY29uc3QgZG91YmxlICZhLCBjb25zdCBQVCAmYikgeyByZXR1cm4gUFQoYSAqIGIueCwgYSAqIGIueSk7IH0KICAgIFBUIG9wZXJhdG9yIC8gKGNvbnN0IGRvdWJsZSBhKSBjb25zdCB7IHJldHVybiBQVCh4IC8gYSwgeSAvIGEpOyB9CiAgICBib29sIG9wZXJhdG9yID09IChQVCBhKSBjb25zdCB7IHJldHVybiBzaWduKGEueCAtIHgpID09IDAgJiYgc2lnbihhLnkgLSB5KSA9PSAwOyB9CiAgICBib29sIG9wZXJhdG9yICE9IChQVCBhKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IGEpOyB9CiAgICBib29sIG9wZXJhdG9yIDwgKFBUIGEpIGNvbnN0IHsgcmV0dXJuIHNpZ24oYS54IC0geCkgPT0gMCA/IHkgPCBhLnkgOiB4IDwgYS54OyB9CiAgICBib29sIG9wZXJhdG9yID4gKFBUIGEpIGNvbnN0IHsgcmV0dXJuIHNpZ24oYS54IC0geCkgPT0gMCA/IHkgPiBhLnkgOiB4ID4gYS54OyB9CiAgICBkb3VibGUgbm9ybSgpIHsgcmV0dXJuIHNxcnQoeCAqIHggKyB5ICogeSk7IH0KICAgIGRvdWJsZSBub3JtMigpIHsgcmV0dXJuIHggKiB4ICsgeSAqIHk7IH0KICAgIFBUIHBlcnAoKSB7IHJldHVybiBQVCgteSwgeCk7IH0KICAgIGRvdWJsZSBhcmcoKSB7IHJldHVybiBhdGFuMih5LCB4KTsgfQogICAgUFQgdHJ1bmNhdGUoZG91YmxlIHIpIHsgLy8gcmV0dXJucyBhIHZlY3RvciB3aXRoIG5vcm0gciBhbmQgaGF2aW5nIHNhbWUgZGlyZWN0aW9uCiAgICAgICAgZG91YmxlIGsgPSBub3JtKCk7CiAgICAgICAgaWYgKCFzaWduKGspKSByZXR1cm4gKnRoaXM7CiAgICAgICAgciAvPSBrOwogICAgICAgIHJldHVybiBQVCh4ICogciwgeSAqIHIpOwogICAgfQp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW50IHNnbihUIHgpIHsKICAgIHJldHVybiAoVCgwKSA8IHgpIC0gKHggPCBUKDApKTsKfQoKaXN0cmVhbSAmb3BlcmF0b3IgPj4gKGlzdHJlYW0gJmluLCBQVCAmcCkgeyByZXR1cm4gaW4gPj4gcC54ID4+IHAueTsgfQpvc3RyZWFtICZvcGVyYXRvciA8PCAob3N0cmVhbSAmb3V0LCBQVCAmcCkgeyByZXR1cm4gb3V0IDw8ICIoIiA8PCBwLnggPDwgIiwiIDw8IHAueSA8PCAiKSI7IH0KaW5saW5lIGRvdWJsZSBkb3QoUFQgYSwgUFQgYikgeyByZXR1cm4gYS54ICogYi54ICsgYS55ICogYi55OyB9CmlubGluZSBkb3VibGUgZGlzdDIoUFQgYSwgUFQgYikgeyByZXR1cm4gZG90KGEgLSBiLCBhIC0gYik7IH0KaW5saW5lIGRvdWJsZSBkaXN0KFBUIGEsIFBUIGIpIHsgcmV0dXJuIHNxcnQoZG90KGEgLSBiLCBhIC0gYikpOyB9CmlubGluZSBkb3VibGUgY3Jvc3MoUFQgYSwgUFQgYikgeyByZXR1cm4gYS54ICogYi55IC0gYS55ICogYi54OyB9CmlubGluZSBkb3VibGUgY3Jvc3MyKFBUIGEsIFBUIGIsIFBUIGMpIHsgcmV0dXJuIGNyb3NzKGIgLSBhLCBjIC0gYSk7IH0KCi8vIGZpbmQgYSBwb2ludCBmcm9tIGEgdGhyb3VnaCBiIHdpdGggZGlzdGFuY2UgZApQVCBwb2ludF9hbG9uZ19saW5lKFBUIGEsIFBUIGIsIGRvdWJsZSBkKSB7CiAgICBhc3NlcnQoYSAhPSBiKTsKICAgIHJldHVybiBhICsgKCgoYiAtIGEpIC8gKGIgLSBhKS5ub3JtKCkpICogZCk7Cn0KCi8vIG1pbmltdW0gZGlzdGFuY2UgZnJvbSBwb2ludCBjIHRvIGxpbmUgdGhyb3VnaCBhIGFuZCBiCmRvdWJsZSBkaXN0X2Zyb21fcG9pbnRfdG9fbGluZShQVCBhLCBQVCBiLCBQVCBjKSB7CiAgICByZXR1cm4gZmFicyhjcm9zcyhiIC0gYSwgYyAtIGEpIC8gKGIgLSBhKS5ub3JtKCkpOwp9CgoKdm9pZCBTb2x2ZSgpCnsKICAgIFQgeDEsIHkxLCB4MiwgeTI7CiAgICBjaW4gPj4geDEgPj4geTEgPj4geDIgPj4geTI7CiAgICBQVCBUUyh4MSwgeTEpOwogICAgUFQgVEcoeDIsIHkyKTsKICAgIGNpbiA+PiB4MSA+PiB5MSA+PiB4MiA+PiB5MjsKICAgIFBUIEFTKHgxLCB5MSk7CiAgICBQVCBBRyh4MiwgeTIpOwoKICAgIFQgbG8gPSAwLjAsIGhpID0gbWF4KGRpc3QoVFMsIFRHKSwgZGlzdChBUywgQUcpKSwgbWlkMSwgbWlkMiwgcmVzID0gMWU5OwogICAgd2hpbGUgKGhpIC0gbG8gPiAwLjAwMDAwMDEpCiAgICB7CiAgICAgICAgbWlkMSA9IGxvICsgKGhpIC0gbG8pIC8gMy4wOwogICAgICAgIG1pZDIgPSBoaSAtIChoaSAtIGxvKSAvIDMuMDsKICAgICAgICBQVCB4ID0gcG9pbnRfYWxvbmdfbGluZShUUywgVEcsIG1pZDEpOwogICAgICAgIFBUIHkgPSBwb2ludF9hbG9uZ19saW5lKEFTLCBBRywgbWlkMSk7CiAgICAgICAgaWYgKG1pZDEgPiBkaXN0KFRTLCBURykpCiAgICAgICAgICAgIHggPSBURzsKICAgICAgICBpZiAobWlkMSA+IGRpc3QoQVMsIEFHKSkKICAgICAgICAgICAgeSA9IEFHOwogICAgICAgIFQgYzEgPSBkaXN0KHgsIHkpOwogICAgICAgIHggPSBwb2ludF9hbG9uZ19saW5lKFRTLCBURywgbWlkMik7CiAgICAgICAgeSA9IHBvaW50X2Fsb25nX2xpbmUoQVMsIEFHLCBtaWQyKTsKICAgICAgICBpZiAobWlkMiA+IGRpc3QoVFMsIFRHKSkKICAgICAgICAgICAgeCA9IFRHOwogICAgICAgIGlmIChtaWQyID4gZGlzdChBUywgQUcpKQogICAgICAgICAgICB5ID0gQUc7CiAgICAgICAgVCBjMiA9IGRpc3QoeCwgeSk7CgogICAgICAgIGlmIChjMSA8IGMyICsgZXBzKQogICAgICAgIHsKICAgICAgICAgICAgcmVzID0gYzE7CiAgICAgICAgICAgIGhpID0gbWlkMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJlcyA9IGMyOwogICAgICAgICAgICBsbyA9IG1pZDE7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oNikgPDwgcmVzIDw8IGVuZGw7Cn0KaW50IG1haW4oKQp7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CiAgICBpbnQgdCwgVCA9IDE7CiAgICBjaW4gPj4gVDsKICAgIGZvciAodCA9IDE7IHQgPD0gVDsgdCsrKQogICAgICAgIFNvbHZlKCk7CiAgICByZXR1cm4gMDsKfQo=