#include <bits/stdc++.h>
using namespace std;
using ld = long double;
struct P { ld x, y; };
inline P operator+(const P &a, const P &b){ return {a.x + b.x, a.y + b.y}; }
inline P operator-(const P &a, const P &b){ return {a.x - b.x, a.y - b.y}; }
inline P operator*(const P &a, const ld s){ return {a.x * s, a.y * s}; }
inline P operator/(const P &a, const ld s){ return {a.x / s, a.y / s}; }
inline ld dot(const P &a, const P &b){ return a.x*b.x + a.y*b.y; }
inline ld norm2(const P &a){ return dot(a,a); }
ld distance2(const P &a, const P &b){ return norm2(a-b); }
ld min_distance(ld tL, ld tR, const P &A1, const P &v1, const P &A2, const P &v2){
P C = A1 - A2;
P D = v1 - v2;
ld a = dot(D,D);
ld b = 2*dot(C,D);
ld c = dot(C,C);
ld res = min({c, a*tL*tL + b*tL + c, a*tR*tR + b*tR + c});
if(a > 1e-15L){
ld t0 = -b/(2*a);
if(t0 >= tL && t0 <= tR) res = min(res, a*t0*t0 + b*t0 + c);
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(10);
int T; cin >> T;
while(T--){
long long TSx, TSy, TGx, TGy, ASx, ASy, AGx, AGy;
cin >> TSx >> TSy >> TGx >> TGy >> ASx >> ASy >> AGx >> AGy;
P S1 = {(ld)TSx, (ld)TSy}, G1 = {(ld)TGx, (ld)TGy};
P S2 = {(ld)ASx, (ld)ASy}, G2 = {(ld)AGx, (ld)AGy};
P diff1 = G1 - S1, diff2 = G2 - S2;
ld d1 = sqrtl(norm2(diff1)), d2 = sqrtl(norm2(diff2));
P v1 = (d1 < 1e-15L) ? P{0,0} : diff1 / d1;
P v2 = (d2 < 1e-15L) ? P{0,0} : diff2 / d2;
ld tmin = min(d1,d2), tmax = max(d1,d2);
ld ans = min_distance(0.0L, tmin, S1, v1, S2, v2);
if(tmax - tmin > 1e-15L){
if(d1 < d2) ans = min(ans, min_distance(tmin, tmax, G1, P{0,0}, S2, v2));
else ans = min(ans, min_distance(tmin, tmax, S1, v1, G2, P{0,0}));
}
ans = min(ans, distance2(G1, G2));
cout << sqrtl(ans) << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxkID0gbG9uZyBkb3VibGU7CgpzdHJ1Y3QgUCB7IGxkIHgsIHk7IH07CgppbmxpbmUgUCBvcGVyYXRvcisoY29uc3QgUCAmYSwgY29uc3QgUCAmYil7IHJldHVybiB7YS54ICsgYi54LCBhLnkgKyBiLnl9OyB9CmlubGluZSBQIG9wZXJhdG9yLShjb25zdCBQICZhLCBjb25zdCBQICZiKXsgcmV0dXJuIHthLnggLSBiLngsIGEueSAtIGIueX07IH0KaW5saW5lIFAgb3BlcmF0b3IqKGNvbnN0IFAgJmEsIGNvbnN0IGxkIHMpeyByZXR1cm4ge2EueCAqIHMsIGEueSAqIHN9OyB9CmlubGluZSBQIG9wZXJhdG9yLyhjb25zdCBQICZhLCBjb25zdCBsZCBzKXsgcmV0dXJuIHthLnggLyBzLCBhLnkgLyBzfTsgfQoKaW5saW5lIGxkIGRvdChjb25zdCBQICZhLCBjb25zdCBQICZiKXsgcmV0dXJuIGEueCpiLnggKyBhLnkqYi55OyB9CmlubGluZSBsZCBub3JtMihjb25zdCBQICZhKXsgcmV0dXJuIGRvdChhLGEpOyB9CmxkIGRpc3RhbmNlMihjb25zdCBQICZhLCBjb25zdCBQICZiKXsgcmV0dXJuIG5vcm0yKGEtYik7IH0KCmxkIG1pbl9kaXN0YW5jZShsZCB0TCwgbGQgdFIsIGNvbnN0IFAgJkExLCBjb25zdCBQICZ2MSwgY29uc3QgUCAmQTIsIGNvbnN0IFAgJnYyKXsKICAgIFAgQyA9IEExIC0gQTI7CiAgICBQIEQgPSB2MSAtIHYyOwogICAgbGQgYSA9IGRvdChELEQpOwogICAgbGQgYiA9IDIqZG90KEMsRCk7CiAgICBsZCBjID0gZG90KEMsQyk7CiAgICBsZCByZXMgPSBtaW4oe2MsIGEqdEwqdEwgKyBiKnRMICsgYywgYSp0Uip0UiArIGIqdFIgKyBjfSk7CiAgICBpZihhID4gMWUtMTVMKXsKICAgICAgICBsZCB0MCA9IC1iLygyKmEpOwogICAgICAgIGlmKHQwID49IHRMICYmIHQwIDw9IHRSKSByZXMgPSBtaW4ocmVzLCBhKnQwKnQwICsgYip0MCArIGMpOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbigxMCk7CgogICAgaW50IFQ7IGNpbiA+PiBUOwogICAgd2hpbGUoVC0tKXsKICAgICAgICBsb25nIGxvbmcgVFN4LCBUU3ksIFRHeCwgVEd5LCBBU3gsIEFTeSwgQUd4LCBBR3k7CiAgICAgICAgY2luID4+IFRTeCA+PiBUU3kgPj4gVEd4ID4+IFRHeSA+PiBBU3ggPj4gQVN5ID4+IEFHeCA+PiBBR3k7CgogICAgICAgIFAgUzEgPSB7KGxkKVRTeCwgKGxkKVRTeX0sIEcxID0geyhsZClUR3gsIChsZClUR3l9OwogICAgICAgIFAgUzIgPSB7KGxkKUFTeCwgKGxkKUFTeX0sIEcyID0geyhsZClBR3gsIChsZClBR3l9OwoKICAgICAgICBQIGRpZmYxID0gRzEgLSBTMSwgZGlmZjIgPSBHMiAtIFMyOwogICAgICAgIGxkIGQxID0gc3FydGwobm9ybTIoZGlmZjEpKSwgZDIgPSBzcXJ0bChub3JtMihkaWZmMikpOwoKICAgICAgICBQIHYxID0gKGQxIDwgMWUtMTVMKSA/IFB7MCwwfSA6IGRpZmYxIC8gZDE7CiAgICAgICAgUCB2MiA9IChkMiA8IDFlLTE1TCkgPyBQezAsMH0gOiBkaWZmMiAvIGQyOwoKICAgICAgICBsZCB0bWluID0gbWluKGQxLGQyKSwgdG1heCA9IG1heChkMSxkMik7CgogICAgICAgIGxkIGFucyA9IG1pbl9kaXN0YW5jZSgwLjBMLCB0bWluLCBTMSwgdjEsIFMyLCB2Mik7CgogICAgICAgIGlmKHRtYXggLSB0bWluID4gMWUtMTVMKXsKICAgICAgICAgICAgaWYoZDEgPCBkMikgYW5zID0gbWluKGFucywgbWluX2Rpc3RhbmNlKHRtaW4sIHRtYXgsIEcxLCBQezAsMH0sIFMyLCB2MikpOwogICAgICAgICAgICBlbHNlIGFucyA9IG1pbihhbnMsIG1pbl9kaXN0YW5jZSh0bWluLCB0bWF4LCBTMSwgdjEsIEcyLCBQezAsMH0pKTsKICAgICAgICB9CgogICAgICAgIGFucyA9IG1pbihhbnMsIGRpc3RhbmNlMihHMSwgRzIpKTsKCiAgICAgICAgY291dCA8PCBzcXJ0bChhbnMpIDw8ICdcbic7CiAgICB9Cn0=