#include <cstdio>
#include <cstring>
using namespace std;
const int mod=1<<20,dirx[9]={0,-1,-1,0,1,1,1,0,-1},diry[9]={0,0,1,1,1,0,-1,-1,-1};
struct punct
{
int x,y;
}v[1000000];
int v1[mod],n,w,h,nr;
char pars[10000000];
inline int normx(int x)
{
return x/w+1;
}
inline int normy(int y)
{
return y/h+1;
}
inline int inc(int &a)
{
if(++a==mod) a=0;
}
inline void hash_insert(int i)
{
int a=(normx(v[i].x)*23+1LL*normy(v[i].y)*997)%mod;
for(;v1[a];inc(a));
v1[a]=i;
}
inline int hash_find(int x,int y)
{
int a=(x*23+1LL*y*997)%mod;
for(;v1[a] && (normx(v[v1[a]].x)!=x || normy(v[v1[a]].y)!=y);inc(a));
return v1[a];
}
inline int inter(int i,int x,int y)
{
if(v[i].x<x && v[i].x+w>x && v[i].y<y && v[i].y+h>y) return 1;
return 0;
}
inline int read()
{
int x=0;
for(;pars[nr]>='0' && pars[nr]<='9';nr++) x=x*10+pars[nr]-'0';
nr++;
return x;
}
int main()
{
freopen("harta2.in", "r", stdin);
freopen("harta2.out", "w", stdout);
fread(pars,1,10000000,stdin);
n=read();
for(int i=1;i<=n;i++)
{
v[i].x=read()*1000;
v[i].y=read()*1000;
}
int st=999,dr=1000000000;
while(st<=dr)
{
memset(v1,0,sizeof(v1));
int mid=(st+dr)/2,ok=0;
w=3*mid;h=mid;
hash_insert(1);
for(int i=2;i<=n;i++)
{
int x=normx(v[i].x),y=normy(v[i].y),a;
for(int j=0;j<9;j++)
{
if(x+dirx[j]<1 || y+diry[j]<1) a=0;
else a=hash_find(x+dirx[j],y+diry[j]);
if(a && inter(a,v[i].x,v[i].y) || inter(a,v[i].x+w,v[i].y) || inter(a,v[i].x,v[i].y+h) || inter(a,v[i].x+w,v[i].y+h)) {ok=1;break;}
}
if(!ok) hash_insert(i);
else break;
}
if(ok) dr=mid-1;
else st=mid+1;
}
printf("%.3lf",(double)dr/1000.0);
return 0;
}