#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<list>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
#define fi first
#define se second
#define mp make_pair
#define mt make_tuple
#define pqueue priority_queue
const int inf=1e9+7;
const ll mod=1e9+7;
const ll mod1=998244353;
const ll big=1e18;
const double PI=2*asin(1);

int main() {
  int N;
  cin>>N;
  vector<tuple<double, double, int> > node(N), node1(N);
  double x, y;
  for(int i=0;i<N;++i) {
    cin>>x>>y;
    node[i] = mt(x, y, i);
    node1[i] = mt(x, y, i);
  }
  sort(node.begin(), node.end());
  bool vert[N];
  for(int i=0;i<N;++i) vert[i] = false;

  double y1 = get<1>(node[0]);
  vector<tuple<double, double, int> > tmpvert1, tmpvert2;
  tmpvert1.push_back(mt(get<0>(node[0]), get<1>(node[0]), get<2>(node[0])));
  tmpvert2.push_back(mt(get<0>(node[0]), get<1>(node[0]), get<2>(node[0])));
  vert[get<2>(node[0])] = true;
  int index;
  double vecx1, vecy1, vecx2, vecy2;
  for(int i=1;i<N;++i) {
    x = get<0>(node[i]);
    y = get<1>(node[i]);
    index = get<2>(node[i]);
    tmpvert1.push_back(mt(x, y, index));
    vert[index] = true;
    while (tmpvert1.size()>2) {
      vecx1 = get<0>(tmpvert1[tmpvert1.size()-1]) - get<0>(tmpvert1[tmpvert1.size()-2]);
      vecy1 = get<1>(tmpvert1[tmpvert1.size()-1]) - get<1>(tmpvert1[tmpvert1.size()-2]);
      vecx2 = get<0>(tmpvert1[tmpvert1.size()-2]) - get<0>(tmpvert1[tmpvert1.size()-3]);
      vecy2 = get<1>(tmpvert1[tmpvert1.size()-2]) - get<1>(tmpvert1[tmpvert1.size()-3]);
      if(vecx2*vecy1-vecy2*vecx1<0) break;
      else {
        vert[get<2>(tmpvert1[tmpvert1.size()-2])] = false;
        tmpvert1[tmpvert1.size()-2] = tmpvert1[tmpvert1.size()-1];
        tmpvert1.pop_back();
      }
    }
    tmpvert2.push_back(mt(x, y, index));
    vert[index] = true;
    while(tmpvert2.size()>2) {
      vecx1 = get<0>(tmpvert2[tmpvert2.size()-1]) - get<0>(tmpvert2[tmpvert2.size()-2]);
      vecy1 = get<1>(tmpvert2[tmpvert2.size()-1]) - get<1>(tmpvert2[tmpvert2.size()-2]);
      vecx2 = get<0>(tmpvert2[tmpvert2.size()-2]) - get<0>(tmpvert2[tmpvert2.size()-3]);
      vecy2 = get<1>(tmpvert2[tmpvert2.size()-2]) - get<1>(tmpvert2[tmpvert2.size()-3]);
      if(vecx2*vecy1-vecy2*vecx1>0) break;
      else {
        vert[get<2>(tmpvert2[tmpvert2.size()-2])] = false;
        tmpvert2[tmpvert2.size()-2] = tmpvert2[tmpvert2.size()-1];
        tmpvert2.pop_back();
      }
    }
  }
  double ans[N];
  vector<int> ansarr;
  map<int, int> amap;
  for(int i=0;i<tmpvert1.size();++i) {
    if(amap[get<2>(tmpvert1[i])]==0) ansarr.push_back(get<2>(tmpvert1[i]));
    amap[get<2>(tmpvert1[i])]++;
  }
  for(int i=tmpvert2.size()-1;i>=0;--i) {
    if(amap[get<2>(tmpvert2[i])]==0) ansarr.push_back(get<2>(tmpvert2[i]));
    amap[get<2>(tmpvert2[i])]++;
  }
  vector<pair<double, int> > theta;
  ll tmp1, tmp2;
  for(int i=0;i<ansarr.size();++i) {
    if(i==0) {
      vecx1 = get<0>(node1[ansarr[i+1]]) - get<0>(node1[ansarr[i]]);
      vecy1 = get<1>(node1[ansarr[i+1]]) - get<1>(node1[ansarr[i]]);
      vecx2 = get<0>(node1[ansarr[ansarr.size()-1]]) - get<0>(node1[ansarr[i]]);
      vecy2 = get<1>(node1[ansarr[ansarr.size()-1]]) - get<1>(node1[ansarr[i]]);
      tmp1 = max(abs(vecx1), abs(vecy1));
      tmp2 = max(abs(vecx2), abs(vecy2));
      vecx1 /= tmp1;
      vecy1 /= tmp1;
      vecx2 /= tmp2;
      vecy2 /= tmp2;
      index = get<2>(node1[ansarr[i]]);
      theta.push_back(mp(acos(((double)vecx1*(double)vecx2+(double)vecy1*(double)vecy2)/(sqrt(pow((double)vecx1, 2)+pow((double)vecy1, 2))*sqrt(pow((double)vecx2, 2)+pow((double)vecy2, 2)))), index));
      theta[theta.size()-1].fi *= 180/PI;
    }
    else if(i==ansarr.size()-1) {
      vecx1 = get<0>(node1[ansarr[0]]) - get<0>(node1[ansarr[i]]);
      vecy1 = get<1>(node1[ansarr[0]]) - get<1>(node1[ansarr[i]]);
      vecx2 = get<0>(node1[ansarr[i-1]]) - get<0>(node1[ansarr[i]]);
      vecy2 = get<1>(node1[ansarr[i-1]]) - get<1>(node1[ansarr[i]]);
      tmp1 = max(abs(vecx1), abs(vecy1));
      tmp2 = max(abs(vecx2), abs(vecy2));
      vecx1 /= tmp1;
      vecy1 /= tmp1;
      vecx2 /= tmp2;
      vecy2 /= tmp2;
      index = get<2>(node1[ansarr[i]]);
      theta.push_back(mp(acos(((double)vecx1*(double)vecx2+(double)vecy1*(double)vecy2)/(sqrt(pow((double)vecx1, 2)+pow((double)vecy1, 2))*sqrt(pow((double)vecx2, 2)+pow((double)vecy2, 2)))), index));
      theta[theta.size()-1].fi *= 180/PI;
    }
    else {
      vecx1 = get<0>(node1[ansarr[i+1]]) - get<0>(node1[ansarr[i]]);
      vecy1 = get<1>(node1[ansarr[i+1]]) - get<1>(node1[ansarr[i]]);
      vecx2 = get<0>(node1[ansarr[i-1]]) - get<0>(node1[ansarr[i]]);
      vecy2 = get<1>(node1[ansarr[i-1]]) - get<1>(node1[ansarr[i]]);
      tmp1 = max(abs(vecx1), abs(vecy1));
      tmp2 = max(abs(vecx2), abs(vecy2));
      vecx1 /= tmp1;
      vecy1 /= tmp1;
      vecx2 /= tmp2;
      vecy2 /= tmp2;
      index = get<2>(node1[ansarr[i]]);
      theta.push_back(mp(acos(((double)vecx1*(double)vecx2+(double)vecy1*(double)vecy2)/(sqrt(pow((double)vecx1, 2)+pow((double)vecy1, 2))*sqrt(pow((double)vecx2, 2)+pow((double)vecy2, 2)))), index));
      theta[theta.size()-1].fi *= 180/PI;
    }
  }
  for(int i=0;i<N;++i) ans[i] = 0;
  for(int i=0;i<theta.size();++i) {
    ans[theta[i].se] = (180-theta[i].fi)/360;
  }
  for(int i=0;i<N;++i) {
    cout<<setprecision(20)<<fixed<<ans[i]<<endl;
  }
}


Measured memory_bytes: 4148