#include <bits/stdc++.h>
using namespace std;
long long int powmod(long long int a, int b, int n) {
  long long int rm = 1;
  while (b) {
    if (b % 2) {
      rm = (rm * a) % n;
    }
    a = (a * a) % n;
    b /= 2;
  }
  return rm;
}
int n, x[int(1e5 + 10)], y[int(1e5 + 10)],
    t = 0, a[int(1e5 + 10)], mnv[int(1e5 + 10)] = {0}, mxv[int(1e5 + 10)] = {0},
    dpmnud[int(1e5 + 10)] = {0}, dpmxud[int(1e5 + 10)] = {0},
    dpmndu[int(1e5 + 10)] = {0}, dpmxdu[int(1e5 + 10)] = {0};
map<int, int> xy;
double linedis(int i, int j) {
  i = mnv[i], j = mnv[j];
  double x2 = y[i] - (y[j] - x[j]), x1 = x[i];
  return abs(x2 - x1);
}
double getdis2(int p1, int p2) {
  double x2 = (x[p2] + y[p2]) - y[p1];
  return abs(x[p1] - x2);
}
bool process(int p1, int p2, double dis) {
  int mnp = -1, mxp = -1;
  if (p1 == 1 && p2 == t) return true;
  if (p1 > 1) {
    mnp = dpmnud[p1 - 1], mxp = dpmxud[p1 - 1];
  }
  if (p2 < t) {
    if (mnp == -1) {
      mnp = dpmndu[p2 + 1], mxp = dpmxdu[p2 + 1];
    } else {
      int id2 = dpmndu[p2 + 1];
      if (y[id2] + x[id2] > y[mnp] + x[mnp]) {
        mnp = mnp;
      } else
        mnp = id2;
      id2 = dpmxdu[p2 + 1];
      if (y[id2] + x[id2] < y[mxp] + x[mxp]) {
        mxp = mxp;
      } else
        mxp = id2;
    }
  }
  double dis2 = getdis2(mnp, mxp);
  if (dis >= dis2) return true;
  return false;
}
bool check(double dis) {
  dis *= 2.0;
  int p1 = 1, p2 = 1;
  while (p1 <= t) {
    while (p2 <= t) {
      if (linedis(p1, p2) > dis) {
        break;
      }
      bool ans = process(p1, p2, dis);
      if (ans == true) {
        return true;
      }
      p2++;
      if (p2 > t) break;
    }
    if (p2 > t) break;
    p1++;
    p2 = max(p1, p2);
  }
  return false;
}
int main() {
  cin >> n;
  for (int i = int(1); i <= (int)n; i++) cin >> x[i] >> y[i];
  for (int i = 1; i <= n; ++i) {
    int c = y[i] - x[i];
    if (xy[c] == 0) {
      xy[c] = 1;
      a[++t] = c;
    }
  }
  sort(a + 1, a + t + 1);
  for (int i = 1; i <= t; ++i) xy[a[i]] = t - i + 1;
  for (int i = 1; i <= n; ++i) {
    int id = xy[y[i] - x[i]];
    if (x[i] < x[mnv[id]] || mnv[id] == 0) {
      mnv[id] = i;
    }
    if (x[i] > x[mxv[id]] || mxv[id] == 0) {
      mxv[id] = i;
    }
  }
  for (int i = 1; i <= t; ++i) {
    if (i == 1) {
      dpmnud[i] = mnv[i], dpmxud[i] = mxv[i];
    } else {
      if (y[mnv[i]] + x[mnv[i]] < y[dpmnud[i - 1]] + x[dpmnud[i - 1]]) {
        dpmnud[i] = mnv[i];
      } else
        dpmnud[i] = dpmnud[i - 1];
      if (y[mxv[i]] + x[mxv[i]] > y[dpmxud[i - 1]] + x[dpmxud[i - 1]]) {
        dpmxud[i] = mxv[i];
      } else
        dpmxud[i] = dpmxud[i - 1];
    }
  }
  for (int i = t; i >= 1; i--) {
    if (i == t) {
      dpmndu[i] = mnv[i], dpmxdu[i] = mxv[i];
    } else {
      if (y[mnv[i]] + x[mnv[i]] < y[dpmndu[i + 1]] + x[dpmndu[i + 1]]) {
        dpmndu[i] = mnv[i];
      } else
        dpmndu[i] = dpmndu[i + 1];
      if (y[mxv[i]] + x[mxv[i]] > y[dpmxdu[i + 1]] + x[dpmxdu[i + 1]]) {
        dpmxdu[i] = mxv[i];
      } else
        dpmxdu[i] = dpmxdu[i + 1];
    }
  }
  double it = 0, f = 1e15L, m;
  int iter = 80;
  while (iter--) {
    m = (it + f) / 2.0;
    if (check(m))
      f = m;
    else
      it = m;
  }
  printf("%.10lf\n", f);
  return 0;
}
