#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
using namespace std;

typedef long long ll;
//typedef pair<int,int> Pint;
//typedef pair<ll, ll> P;
//typedef pair<ll, pair<ll, ll>> P;
//typedef tuple<int,int,int> T;
typedef vector<ll> vec;
typedef vector<vec> mat;
#define rep(i, n) for(ll i = 0; i < n; i++)
#define revrep(i, n) for(ll i = n-1; i >= 0; i--)
#define pb push_back
#define f first
#define s second
ll INFL = 1LL << 60;//10^18 = 2^60
int INF = 1 << 30;//10^9
ll MOD = 1e9 + 7;
//ll MOD  = 998244353;
vector<ll> dy = {0, 0, 1, -1, 1, 1, -1, -1, 0};
vector<ll> dx = {1, -1, 0, 0, 1, -1, 1, -1, 0};

ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll pow_long(ll x, ll k){
  ll res = 1;
  while(k > 0){
    if(k % 2) res *= x;
    x *= x;
    k /= 2;
  }
  return res;
}

ll pow_mod(ll x, ll k){
  x %= MOD; x += MOD; x %= MOD;
  ll res = 1;
  while(k > 0){
    if(k % 2){
      res *= x; res %= MOD;
    }
    x *= x; x %= MOD;
    k /= 2;
  }
  return res;
}
ll inverse(ll x){return pow_mod(x, MOD - 2);};

ll gcd(ll a, ll b){
    if(b == 0) return a;
    return gcd(b, a % b);
}
ll lcm(ll x, ll y){return x / gcd(x, y) * y % MOD;};






double EPS = 1e-10;
double add(double a, double b){
  if(abs(a + b) < EPS * (abs(a) + abs(b))) return 0;
  return a + b;
}

//二次元ベクトル構造体
struct P{
  double x, y;
  P() {}
  P(double x, double y) : x(x), y(y){
  }
  P operator + (P p){
    return P(add(x, p.x), add(y, p.y));
  }
  P operator - (P p){
    return P(add(x, -p.x), add(y, -p.y));
  }
  P operator * (double d){
    return P(x * d, y * d);
  }
  double dot(P p){//内積
    return add(x * p.x, y * p.y);
  }
  double det(P p){//外積
    return add(x * p.y, -y * p.x);
  }
};

//線分p1-p2上に点qがあるか判定
bool on_seg(P p1, P p2, P q){
  return (p1 - q).det(p2 - q) == 0 && (p1 - q).dot(p2 - q) <= 0;
}

//直線p1-p2と直線q1-q2の交点
P intersection(P p1, P p2, P q1, P q2){
  return p1 + (p2 - p1) * ((q2 - q1).det(q1 - p1) / (q2 - q1).det(p2 - p1));
}

//距離の二乗
double dist(P p, P q){
  return (p - q).dot(p - q);
}

//辞書順で比較
bool cmp_x(const P& p, const P& q){
  if(p.x != q.x) return p.x < q.x;
  return p.y < q.x;
}

//凸包を求める
vector<P> convex_hull(P* ps, int n){
  sort(ps, ps + n, cmp_x);
  int k = 0;//凸包の頂点数
  vector<P> qs(n * 2);//構築中の凸包
  //下側凸包の作成
  for(int i = 0; i < n; i++){
    while(k > 1 && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) <= 0) k--;
    qs[k++] = ps[i];
  }
  //上側凸包の作成
  for(int i = n-2, t = k; i >= 0; i--){
    while(k > t && (qs[k-1] - qs[k-2]).det(ps[i] - qs[k-1]) <= 0) k--;
    qs[k++] = ps[i];
  }
  qs.resize(k-1);
  return qs;
}


int main(){
  ll N;
  cin >> N;
  P xy[N];
  P X[N];
  rep(i, N){
    P p;
    cin >> p.x >> p.y;
    xy[i] = p;
    X[i] = p;
  }
  vector<P> totuhou = convex_hull(xy, N);
  int T = totuhou.size();
  for(int i = 0; i < N; i++){
    int itr = -1;
    for(int j = 0; j < T; j++){
      if(X[i].x == totuhou[j].x && X[i].y == totuhou[j].y) itr = j;
    }
    if(itr == -1){
      cout << 0 << endl;
      continue;
    }

    int a = (itr-1+T) % T;
    int b = (itr+1) % T;
    //a-itr-b
    double radian1 = atan2(totuhou[a].y - X[i].y, totuhou[a].x - X[i].x);
    double radian2 = atan2(totuhou[b].y - X[i].y, totuhou[b].x - X[i].x);
    double radian = radian1 - radian2;
    double kakudo = radian * 180 / M_PI;
    if(kakudo < 0) kakudo += 360;
    kakudo = 180 - kakudo;
    double ans = kakudo / 360;
    cout << fixed << setprecision(10) << ans << endl;
  }




}


Measured memory_bytes: 512