#include <iostream>
#include <cstdio>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <stack>
#include <climits>
#include <deque>
#include <bitset>
#include <cassert>
#include <ctime>
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int dy[]={-1,0,1,0},dx[]={0,1,0,-1};
// adjust problem by problem
const double EPS=1e-8;
const double PI=acos(-1.0);
#ifdef __GNUC__
int popcount(int n){return __builtin_popcount(n);}
int popcount(ll n){return __builtin_popcountll(n);}
#endif
#ifndef __GNUC__
template<class T> int popcount(T n){int cnt=0;while(n){if(n%2)cnt++;n/=2;}return cnt;}
#endif
template<class T>int SIZE(T a){return a.size();}
template<class T>string IntToString(T num){string res;stringstream ss;ss<<num;return ss.str();}
template<class T>T StringToInt(string str){T res=0;for(int i=0;i<SIZE(str);i++)res=(res*10+str[i]-'0');return res;}
template<class T>T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
template<class T>T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> void PrintSeq(T &a,int sz){for(int i=0;i<sz;i++){cout<<a[i];if(sz==i+1)cout<<endl;else cout<<' ';}}
void fastStream(){cin.tie(0);std::ios_base::sync_with_stdio(0);}
vector<string> split(string str,char del){
  vector<string> res;
  for(int i=0,s=0;i<SIZE(str);i++){
    if(str[i]==del){if(i-s!=0)res.push_back(str.substr(s,i-s));s=i+1;}
    else if(i==SIZE(str)-1){res.push_back(str.substr(s));}
  }
  return res;
}

typedef complex<double> P;
bool EQ(double a,double b){
  return abs((a)-(b))<EPS;
}
bool EQV(P &a,P &b){
  return (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()));
}
void fast_stream(){
  std::ios_base::sync_with_stdio(0);
}
// 内積
double dot(const P &a, const P &b) {
  return (a.real() * b.real() + a.imag() * b.imag());
}
// 外積
double cross(const P &a, const P &b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
// 辞書順で比較
bool cmp_x(const P&p,const P&q){
  if(!EQ(p.real(),q.real()))return p.real()<q.real();
  return p.imag()<q.imag();
}
// a1,a2を端点とする線分とb1,b2を端点とする線分の交差判定
int is_intersected_ls(const P &a1, const P &a2, const P &b1, const P &b2) {
    // 線分が平行な場合は重なっていないことにする
    if(abs(cross(a2-a1,b2-b1)) < EPS){
        return 0;
    }
    return ( cross(a2-a1, b1-a1) * cross(a2-a1, b2-a1) < EPS ) &&
        ( cross(b2-b1, a1-b1) * cross(b2-b1, a2-b1) < EPS );
}

// 凸包を求める
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&&(cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<0||EQ(cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1]),0)))k--;
    qs[k++]=ps[i];
  }
  for(int i=n-2,t=k;i>=0;i--){
    while(k>t&&(cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1])<0||EQ(cross(qs[k-1]-qs[k-2],ps[i]-qs[k-1]),0)))k--;
    qs[k++]=ps[i];
  }
  qs.resize(k-1);
  return qs;
}

int N;
int X[210];
int Y[210];
P ps[210];
double ress[210];

int get_idx(double x, double y){
    for(int i = 0; i < N; i++){
        if(EQ(x, X[i]) && EQ(y, Y[i]))
            return i;
    }
    return -1;
}

P roundPoint(const P &p,double a){
  return P(cos(a)*p.real()-sin(a)*p.imag(),sin(a)*p.real()+cos(a)*p.imag());
}


// 2ベクトル間の角度
// aからbへ左周りで何度か(0->2*PI)
double diffAngle(const P &a,const P &b){
  double angle=atan2(cross(a,b),dot(a,b));
  if(angle<0)
    return 2*PI+angle;
  return angle;
}

int main(){

    cin >> N;
    for(int i = 0; i < N; i++) cin >> X[i] >> Y[i];
    for(int i = 0; i < N; i++) ps[i] = P(X[i], Y[i]);
    vector<P> ch = convex_hull(ps, N);
    

    if(ch.size() == 2){
        for(int i = 0; i < (int)ch.size(); i++){
            const int idx = get_idx(ch[i].real(), ch[i].imag());
            ress[idx] = 0.5;
        }
    }
    else{
        // for(int i = 0; i < (int)ch.size(); i++){
        //     cout << ch[i] << endl;
        // }

        for(int i = 0; i < (int)ch.size(); i++){
            // ch[i-1]とch[i]のなす直線
            // ch[i]とch[i+1]のなす直線をもとめ、その間の角度を計算する
            P cp1 = (ch[(i-1+(int)ch.size()) % (int)ch.size()] - ch[i]); cp1 = roundPoint(cp1, PI/2);
            P cp2 = (ch[(i+1) % (int)ch.size()] - ch[i]); cp2 = roundPoint(cp2, 3*PI/2);
            double a = diffAngle(cp1, cp2);
            if(a >= PI) a = 2*PI - a;
            ress[get_idx(ch[i].real(), ch[i].imag())] = a / (PI * 2);
        }
    }

    for(int i = 0; i < N; i++){
        printf("%.10f\n", ress[i]);
    }
    
    return 0;
}


Measured memory_bytes: 256