#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 t){ return {a.x*t, a.y*t}; }
ld dist2(P a, P b){ return (a-b).x*(a-b).x + (a-b).y*(a-b).y; }
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(10);
int T; cin >> T;
while(T--){
ld TSx, TSy, TGx, TGy, ASx, ASy, AGx, AGy;
cin >> TSx >> TSy >> TGx >> TGy >> ASx >> ASy >> AGx >> AGy;
P S1={TSx,TSy}, G1={TGx,TGy};
P S2={ASx,ASy}, G2={AGx,AGy};
P d1 = G1 - S1;
P d2 = G2 - S2;
ld L1 = sqrtl(d1.x*d1.x + d1.y*d1.y);
ld L2 = sqrtl(d2.x*d2.x + d2.y*d2.y);
// 속도 벡터 (거리 / L)
P v1 = (L1==0) ? P{0,0} : d1*(1.0L/L1);
P v2 = (L2==0) ? P{0,0} : d2*(1.0L/L2);
ld tmax = max(L1,L2);
ld left=0.0L, right=tmax;
for(int iter=0;iter<100;++iter){
ld t1 = left + (right-left)/3;
ld t2 = right - (right-left)/3;
P p1 = S1 + v1*(min(t1,L1));
P p2 = S2 + v2*(min(t1,L2));
ld d_1 = dist2(p1,p2);
p1 = S1 + v1*(min(t2,L1));
p2 = S2 + v2*(min(t2,L2));
ld d_2 = dist2(p1,p2);
if(d_1 < d_2) right = t2;
else left = t1;
}
P p1 = S1 + v1*(min(left,L1));
P p2 = S2 + v2*(min(left,L2));
cout << sqrtl(dist2(p1,p2)) << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxkID0gbG9uZyBkb3VibGU7CgpzdHJ1Y3QgUCB7IGxkIHgsIHk7IH07CgppbmxpbmUgUCBvcGVyYXRvcisoY29uc3QgUCAmYSwgY29uc3QgUCAmYil7IHJldHVybiB7YS54K2IueCwgYS55K2IueX07IH0KaW5saW5lIFAgb3BlcmF0b3ItKGNvbnN0IFAgJmEsIGNvbnN0IFAgJmIpeyByZXR1cm4ge2EueC1iLngsIGEueS1iLnl9OyB9CmlubGluZSBQIG9wZXJhdG9yKihjb25zdCBQICZhLCBjb25zdCBsZCB0KXsgcmV0dXJuIHthLngqdCwgYS55KnR9OyB9CgpsZCBkaXN0MihQIGEsIFAgYil7IHJldHVybiAoYS1iKS54KihhLWIpLnggKyAoYS1iKS55KihhLWIpLnk7IH0KCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oMTApOwoKICAgIGludCBUOyBjaW4gPj4gVDsKICAgIHdoaWxlKFQtLSl7CiAgICAgICAgbGQgVFN4LCBUU3ksIFRHeCwgVEd5LCBBU3gsIEFTeSwgQUd4LCBBR3k7CiAgICAgICAgY2luID4+IFRTeCA+PiBUU3kgPj4gVEd4ID4+IFRHeSA+PiBBU3ggPj4gQVN5ID4+IEFHeCA+PiBBR3k7CgogICAgICAgIFAgUzE9e1RTeCxUU3l9LCBHMT17VEd4LFRHeX07CiAgICAgICAgUCBTMj17QVN4LEFTeX0sIEcyPXtBR3gsQUd5fTsKCiAgICAgICAgUCBkMSA9IEcxIC0gUzE7CiAgICAgICAgUCBkMiA9IEcyIC0gUzI7CiAgICAgICAgbGQgTDEgPSBzcXJ0bChkMS54KmQxLnggKyBkMS55KmQxLnkpOwogICAgICAgIGxkIEwyID0gc3FydGwoZDIueCpkMi54ICsgZDIueSpkMi55KTsKCiAgICAgICAgLy8g7IaN64+EIOuyoe2EsCAo6rGw66asIC8gTCkKICAgICAgICBQIHYxID0gKEwxPT0wKSA/IFB7MCwwfSA6IGQxKigxLjBML0wxKTsKICAgICAgICBQIHYyID0gKEwyPT0wKSA/IFB7MCwwfSA6IGQyKigxLjBML0wyKTsKCiAgICAgICAgbGQgdG1heCA9IG1heChMMSxMMik7CiAgICAgICAgbGQgbGVmdD0wLjBMLCByaWdodD10bWF4OwoKICAgICAgICBmb3IoaW50IGl0ZXI9MDtpdGVyPDEwMDsrK2l0ZXIpewogICAgICAgICAgICBsZCB0MSA9IGxlZnQgKyAocmlnaHQtbGVmdCkvMzsKICAgICAgICAgICAgbGQgdDIgPSByaWdodCAtIChyaWdodC1sZWZ0KS8zOwoKICAgICAgICAgICAgUCBwMSA9IFMxICsgdjEqKG1pbih0MSxMMSkpOwogICAgICAgICAgICBQIHAyID0gUzIgKyB2MioobWluKHQxLEwyKSk7CiAgICAgICAgICAgIGxkIGRfMSA9IGRpc3QyKHAxLHAyKTsKCiAgICAgICAgICAgIHAxID0gUzEgKyB2MSoobWluKHQyLEwxKSk7CiAgICAgICAgICAgIHAyID0gUzIgKyB2MioobWluKHQyLEwyKSk7CiAgICAgICAgICAgIGxkIGRfMiA9IGRpc3QyKHAxLHAyKTsKCiAgICAgICAgICAgIGlmKGRfMSA8IGRfMikgcmlnaHQgPSB0MjsKICAgICAgICAgICAgZWxzZSBsZWZ0ID0gdDE7CiAgICAgICAgfQoKICAgICAgICBQIHAxID0gUzEgKyB2MSoobWluKGxlZnQsTDEpKTsKICAgICAgICBQIHAyID0gUzIgKyB2MioobWluKGxlZnQsTDIpKTsKICAgICAgICBjb3V0IDw8IHNxcnRsKGRpc3QyKHAxLHAyKSkgPDwgJ1xuJzsKICAgIH0KfQ==