#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 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); }
// 두 선형 운동의 거리 제곱 최소값 구하기
static ld min_sq_on_interval(ld tL, ld tR, const P &A1, const P &B1, const P &A2, const P &B2){
P C = A1 - A2;
P D = B1 - B2;
ld a = dot(D,D);
ld b = 2 * dot(C,D);
ld c = dot(C,C);
auto eval = [&](ld t)->ld{ return a*t*t + b*t + c; };
ld best = min(eval(tL), eval(tR));
const ld EPS = 1e-18L;
if (a > EPS){
ld t0 = -b / (2*a);
if (t0 > tL && t0 < tR){
best = min(best, eval(t0));
}
}
return best;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
cout.setf(std::ios::fixed);
cout << setprecision(10);
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};
P G1 = {(ld)TGx, (ld)TGy};
P S2 = {(ld)ASx, (ld)ASy};
P G2 = {(ld)AGx, (ld)AGy};
P diff1 = G1 - S1;
P diff2 = G2 - S2;
ld d1 = sqrtl(max((ld)0.0L, norm2(diff1)));
ld d2 = sqrtl(max((ld)0.0L, norm2(diff2)));
// 속도 벡터 (단위 벡터)
P v1 = {diff1.x / d1, diff1.y / d1};
P v2 = {diff2.x / d2, diff2.y / d2};
ld tmin = min(d1, d2);
ld tmax = max(d1, d2);
// 1) 둘 다 이동 중
ld best_sq = min_sq_on_interval(0.0L, tmin, S1, v1, S2, v2);
// 2) 한쪽이 정지한 구간
if (tmax - tmin > 1e-18L){
if (d1 < d2){
// 타카하시 정지, 아오키 이동
best_sq = min(best_sq, min_sq_on_interval(tmin, tmax, G1, P{0,0}, S2, v2));
} else {
// 아오키 정지, 타카하시 이동
best_sq = min(best_sq, min_sq_on_interval(tmin, tmax, S1, v1, G2, P{0,0}));
}
}
// 3) 둘 다 정지 후
best_sq = min(best_sq, norm2(G1 - G2));
cout << (double)sqrt((long double)best_sq) << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxkID0gbG9uZyBkb3VibGU7CgpzdHJ1Y3QgUCB7CiAgICBsZCB4LCB5Owp9OwoKaW5saW5lIFAgb3BlcmF0b3IrKGNvbnN0IFAgJmEsIGNvbnN0IFAgJmIpeyByZXR1cm4ge2EueCArIGIueCwgYS55ICsgYi55fTsgfQppbmxpbmUgUCBvcGVyYXRvci0oY29uc3QgUCAmYSwgY29uc3QgUCAmYil7IHJldHVybiB7YS54IC0gYi54LCBhLnkgLSBiLnl9OyB9CmlubGluZSBQIG9wZXJhdG9yKihjb25zdCBQICZhLCBjb25zdCBsZCBzKXsgcmV0dXJuIHthLnggKiBzLCBhLnkgKiBzfTsgfQoKaW5saW5lIGxkIGRvdChjb25zdCBQICZhLCBjb25zdCBQICZiKXsgcmV0dXJuIGEueCpiLnggKyBhLnkqYi55OyB9CmlubGluZSBsZCBub3JtMihjb25zdCBQICZhKXsgcmV0dXJuIGRvdChhLGEpOyB9CgovLyDrkZAg7ISg7ZiVIOyatOuPmeydmCDqsbDrpqwg7KCc6rOxIOy1nOyGjOqwkiDqtaztlZjquLAKc3RhdGljIGxkIG1pbl9zcV9vbl9pbnRlcnZhbChsZCB0TCwgbGQgdFIsIGNvbnN0IFAgJkExLCBjb25zdCBQICZCMSwgY29uc3QgUCAmQTIsIGNvbnN0IFAgJkIyKXsKICAgIFAgQyA9IEExIC0gQTI7CiAgICBQIEQgPSBCMSAtIEIyOwogICAgbGQgYSA9IGRvdChELEQpOwogICAgbGQgYiA9IDIgKiBkb3QoQyxEKTsKICAgIGxkIGMgPSBkb3QoQyxDKTsKCiAgICBhdXRvIGV2YWwgPSBbJl0obGQgdCktPmxkeyByZXR1cm4gYSp0KnQgKyBiKnQgKyBjOyB9OwogICAgbGQgYmVzdCA9IG1pbihldmFsKHRMKSwgZXZhbCh0UikpOwoKICAgIGNvbnN0IGxkIEVQUyA9IDFlLTE4TDsKICAgIGlmIChhID4gRVBTKXsKICAgICAgICBsZCB0MCA9IC1iIC8gKDIqYSk7CiAgICAgICAgaWYgKHQwID4gdEwgJiYgdDAgPCB0Uil7CiAgICAgICAgICAgIGJlc3QgPSBtaW4oYmVzdCwgZXZhbCh0MCkpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBiZXN0Owp9CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBpbnQgVDsKICAgIGNpbiA+PiBUOwogICAgY291dC5zZXRmKHN0ZDo6aW9zOjpmaXhlZCk7CiAgICBjb3V0IDw8IHNldHByZWNpc2lvbigxMCk7CgogICAgd2hpbGUgKFQtLSl7CiAgICAgICAgbG9uZyBsb25nIFRTeCwgVFN5LCBUR3gsIFRHeSwgQVN4LCBBU3ksIEFHeCwgQUd5OwogICAgICAgIGNpbiA+PiBUU3ggPj4gVFN5ID4+IFRHeCA+PiBUR3kgPj4gQVN4ID4+IEFTeSA+PiBBR3ggPj4gQUd5OwoKICAgICAgICBQIFMxID0geyhsZClUU3gsIChsZClUU3l9OwogICAgICAgIFAgRzEgPSB7KGxkKVRHeCwgKGxkKVRHeX07CiAgICAgICAgUCBTMiA9IHsobGQpQVN4LCAobGQpQVN5fTsKICAgICAgICBQIEcyID0geyhsZClBR3gsIChsZClBR3l9OwoKICAgICAgICBQIGRpZmYxID0gRzEgLSBTMTsKICAgICAgICBQIGRpZmYyID0gRzIgLSBTMjsKCiAgICAgICAgbGQgZDEgPSBzcXJ0bChtYXgoKGxkKTAuMEwsIG5vcm0yKGRpZmYxKSkpOwogICAgICAgIGxkIGQyID0gc3FydGwobWF4KChsZCkwLjBMLCBub3JtMihkaWZmMikpKTsKCiAgICAgICAgLy8g7IaN64+EIOuyoe2EsCAo64uo7JyEIOuyoe2EsCkKICAgICAgICBQIHYxID0ge2RpZmYxLnggLyBkMSwgZGlmZjEueSAvIGQxfTsKICAgICAgICBQIHYyID0ge2RpZmYyLnggLyBkMiwgZGlmZjIueSAvIGQyfTsKCiAgICAgICAgbGQgdG1pbiA9IG1pbihkMSwgZDIpOwogICAgICAgIGxkIHRtYXggPSBtYXgoZDEsIGQyKTsKCiAgICAgICAgLy8gMSkg65GYIOuLpCDsnbTrj5kg7KSRCiAgICAgICAgbGQgYmVzdF9zcSA9IG1pbl9zcV9vbl9pbnRlcnZhbCgwLjBMLCB0bWluLCBTMSwgdjEsIFMyLCB2Mik7CgogICAgICAgIC8vIDIpIO2VnOyqveydtCDsoJXsp4DtlZwg6rWs6rCECiAgICAgICAgaWYgKHRtYXggLSB0bWluID4gMWUtMThMKXsKICAgICAgICAgICAgaWYgKGQxIDwgZDIpewogICAgICAgICAgICAgICAgLy8g7YOA7Lm07ZWY7IucIOygleyngCwg7JWE7Jik7YKkIOydtOuPmQogICAgICAgICAgICAgICAgYmVzdF9zcSA9IG1pbihiZXN0X3NxLCBtaW5fc3Ffb25faW50ZXJ2YWwodG1pbiwgdG1heCwgRzEsIFB7MCwwfSwgUzIsIHYyKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyDslYTsmKTtgqQg7KCV7KeALCDtg4DsubTtlZjsi5wg7J2064+ZCiAgICAgICAgICAgICAgICBiZXN0X3NxID0gbWluKGJlc3Rfc3EsIG1pbl9zcV9vbl9pbnRlcnZhbCh0bWluLCB0bWF4LCBTMSwgdjEsIEcyLCBQezAsMH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gMykg65GYIOuLpCDsoJXsp4Ag7ZuECiAgICAgICAgYmVzdF9zcSA9IG1pbihiZXN0X3NxLCBub3JtMihHMSAtIEcyKSk7CgogICAgICAgIGNvdXQgPDwgKGRvdWJsZSlzcXJ0KChsb25nIGRvdWJsZSliZXN0X3NxKSA8PCAnXG4nOwogICAgfQoKICAgIHJldHVybiAwOwp9