#include <iostream>
#include <cmath>
#include <algorithm>//библиотека, содержащая функции min и max
using namespace std;
double perpendicularx(double x1,double y1, double x2, double y2, double x3, double y3) //функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
{
	double x;
	x=(-x1*(y2-y1)*(y2-y1)+x3*(x2-x1)*(x2-x1)-y1*y2+y1*y1)/((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1));
	return x;
}
double perpendiculary(double x1,double y1, double x2, double y2, double x3, double y3, double x)//функция, которая высчитывает значение абциссы проекции точки на прямую, содержащую отрезок
{
	double y;
	y=(x-x1)*(y2-y1)/(x2-x1)+y1;
	return y;
}
int main() {
	double x, y, x1, x2, x3, x4, y1, y2, y3, y4, temp;
	cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
	double mini=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); //предположим, что минимальное значение, это расстояние от конца одного отрезка до конца другого
	temp=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); //для каждой пары концов разных отрезков высчитываем расстояние между ними
	if (temp<mini)//если оно меньше минимума
	mini=temp;//то меняем минимум
	temp=sqrt((x4-x1)*(x4-x1)+(y4-y1)*(y4-y1));//повторяем для каждой пары концов разных отрезков
	if (temp<mini)
	mini=temp;
	temp=sqrt((x4-x2)*(x4-x2)+(y4-y2)*(y4-y2));
	if (temp<mini)
	mini=temp;
	x=perpendicularx(x1, y1, x2, y2, x3, y3);//получаем абциссу проекции конца одного отрезка на другой 
	y=perpendiculary(x1, y1, x2, y2, x3, y3, x);//ординату
	if ((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1)==0) //в случае, если равно нулю, абцисса будет равна бесконечности, а это возможно в том случае, если конец отрезка совпадает с его проекцией на другой отрезок
	{
		x=x3; // для корректных вычислений приравниваем абциссы и ординаты точки с её проекцией
		y=y3;
	}
	if (x>=min(x1,x2)&&x<=max(x1,x2)&&y>=min(y1,y2)&&y<=max(y1,y2)) //если проекция лежит на отрезке заданном
	{
		temp=sqrt((x3-x)*(x3-x)+(y3-y)*(y3-y));//то проверяем, будет ли расстояние от конца отрезка до её проекции меньше, чем текущий минимум
		if (temp<mini)
		mini=temp;//если да, то меняем значение минимума
	}
	x=perpendicularx(x1, y1, x2, y2, x4, y4); // далее повторяемя для трех других концов отрезков
	y=perpendiculary(x1, y1, x2, y2, x4, y4, x);
	if ((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1)==0)
	{
		x=x4;
		y=y4;
	}
	if (x>=min(x1,x2)&&x<=max(x1,x2)&&y>=min(y1,y2)&&y<=max(y1,y2))
	{
		temp=sqrt((x4-x)*(x4-x)+(y4-y)*(y4-y));
		if (temp<mini)
		mini=temp;
	}
	x=perpendicularx(x3, y3, x4, y4, x1, y1);
	y=perpendiculary(x3, y3, x4, y4, x1, y1, x);
	if ((x4-x3)*(x4-x3)-(y4-y3)*(y4-y3)==0)
	{
		x=x1;
		y=y1;
	}
	if (x>=min(x3,x4)&&x<=max(x3,x4)&&y>=min(y3,y4)&&y<=max(y3,y4))
	{
		temp=sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
		if (temp<mini)
		mini=temp;
	}
	x=perpendicularx(x3, y3, x4, y4, x2, y2);
	y=perpendiculary(x3, y3, x4, y4, x2, y2, x);
	if ((x4-x3)*(x4-x3)-(y4-y3)*(y4-y3)==0)
	{
		x=x2;
		y=y2;
	}
	if (x>=min(x3,x4)&&x<=max(x3,x4)&&y>=min(y3,y4)&&y<=max(y3,y4))
	{
		temp=sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
		if (temp<mini)
		mini=temp;
	}
	cout<<mini<<endl; // выводим минимальное расстояние и переходим на новую строку
	return 0;
}