#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int num;
double x,yy1,yy2,yy3,yy4;
const double eps = 1e-8;
const double inf = 1e20;
const double pi = acos(-1.0);
int sgn(double x){
    if(fabs(x)<eps){
        return 0;
    }
    if(x<0){
        return -1;
    }else{
        return 1;
    }
}
struct Point{
    double x,y;
    Point(){}
    void input(){
        scanf("%lf%lf",&x,&y);
    }
    Point(double _x,double _y){
        x = _x;y = _y;
    }
    bool operator < (Point b)const{
        return sgn(x-b.x)==0?sgn(y-b.y)<0:x<b.x;
    }
    Point operator - (const Point &b)const{
        return Point(x-b.x,y-b.y);
    }
    double operator *(const Point &b)const{
        return x*b.x+y*b.y;
    }
    double operator ^(const Point &b)const{
        return x*b.y-y*b.x;
    }
    double distance(Point p){
        return hypot(x-p.x,y-p.y);
    }
};
struct Line{
    Point s,e;
    Line(){}
    Line(Point _s,Point _e){
        s = _s;e = _e;
    }
    // 线段长度
    double length(){
        return s.distance(e);
    }
    // 判断线段是否相交
    int segcrossseg(Line v){
        int d1 = sgn((e-s)^(v.s-s));
        int d2 = sgn((e-s)^(v.e-s));
        int d3 = sgn((v.e-v.s)^(s-v.s));
        int d4 = sgn((v.e-v.s)^(e-v.s));
        if((d1^d2) == -2 && (d3^d4)==-2){
            return 2;
        }
        return (d1==0&&sgn((v.s-s)*(v.s-e))<=0)||(d2==0&&sgn((v.e-s)*(v.e-e))<=0)||(d3==0&&sgn((s-v.s)*(s-v.e))<=0)||(d4==0&&sgn((e-v.s)*(e-v.e))<=0);
    }
    // 点线距离
    double dispointtoline(Point p){
        return fabs((p-s)^(e-s))/length();//面积除以高
    }
    // 点到线段距离（当是钝角的时候，距离不是延长线，而是到两个端点的最小值）
    double dispointtoseg(Point p){
        if(sgn((p-s)*(e-s))<0||sgn((p-e)*(s-e))<0){
            return min(p.distance(s),p.distance(e));
        }
        return dispointtoline(p);
    }
    // 线段到线段的距离
    // 用之前判断是否相交
    double dissegtoseg(Line v){
        return min(min(dispointtoseg(v.s),dispointtoseg(v.e)),min(v.dispointtoseg(s),v.dispointtoseg(e)));
    }
};
int main(){
    int q;
    scanf("%d",&q);
    Point p0,p1,p2,p3;
    while(q--){
        p0.input();
        p1.input();
        p2.input();
        p3.input();
        Line line1(p0,p1);
        Line line2(p2,p3);
        double ans = 0;
        if(line1.segcrossseg(line2) == 0){
            ans = line1.dissegtoseg(line2);
        }
        printf("%.10f\n",ans);
    }

    return 0;
}

