#include <bits/stdc++.h>
using namespace std;
template <typename T>
void _dbg(char const* s, const T& t) {
  cout << s << "=" << t << endl;
}
template <typename T, typename... TA>
void _dbg(char const* s, const T& t, const TA&... ta) {
  while (*s != ',') cout << *s++;
  cout << "=" << t << ",";
  _dbg(s + 1, ta...);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  return os << "{" << p.first << "," << p.second << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "{";
  for (auto it = v.begin(); it != v.end(); ++it) {
    if (it != v.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, const map<T1, T2>& mp) {
  os << "{";
  for (auto it = mp.begin(); it != mp.end(); ++it) {
    if (it != mp.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& s) {
  os << "{";
  for (auto it = s.begin(); it != s.end(); ++it) {
    if (it != s.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <typename T>
ostream& operator<<(ostream& os, const multiset<T>& s) {
  os << "{";
  for (auto it = s.begin(); it != s.end(); ++it) {
    if (it != s.begin()) os << ",";
    os << *it;
  }
  return os << "}";
}
template <size_t N>
ostream& operator<<(ostream& os, const bitset<N>& bs) {
  os << "{";
  for (size_t i = 0; i < N; ++i) {
    cout << bs[i];
  }
  return os << "}";
}
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdd = pair<ld, ld>;
using namespace std;
const long double eps = 1e-9;
inline bool gt(const long double& x, const long double& y) { return x > y; }
inline bool lt(const long double& x, const long double& y) {
  return y > x + eps;
}
inline long double safe_sqrt(const long double& D) {
  return D < 0 ? 0 : sqrt(D);
}
struct pt {
  long double x, y;
  pt() {}
  pt(long double a, long double b) : x(a), y(b) {}
};
const int N = 1e5 + 5;
const int STEPS = 150;
int n;
pt p[N];
inline bool can(long double R) {
  long double l = -1e16 - 1, r = 1e16 + 1;
  for (int i = 0; i < n; i++) {
    long double b = -2 * p[i].x;
    long double c = p[i].x * p[i].x + p[i].y * p[i].y - 2 * p[i].y * R;
    long double D = b * b - 4 * c;
    if (D < 0) return false;
    D = safe_sqrt(D);
    long double x1 = p[i].x - D / 2, x2 = p[i].x + D / 2;
    l = max(l, x1);
    r = min(r, x2);
  }
  return !gt(l, r);
}
void solve() {
  cin >> n;
  bool pos = 0, neg = 0;
  for (int i = 0; i < n; ++i) {
    cin >> p[i].x >> p[i].y;
    if (p[i].y > 0)
      pos = 1;
    else
      neg = 1;
  }
  if (pos && neg) {
    cout << -1 << endl;
    return;
  }
  if (neg) {
    for (int i = 0; i < n; ++i) p[i].y = -p[i].y;
  }
  long double L = 0, R = 1e16;
  for (int step = 0; step < STEPS; step++) {
    long double mid = L + (R - L) / 2.0;
    if (can(mid))
      R = mid;
    else
      L = mid;
  }
  cout << setprecision(16) << fixed << L + (R - L) / 2 << endl;
}
int main() {
  solve();
  return 0;
}
