#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1);
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
  bool operator<(const point& o) const {
    if (fabs(x - o.x) < eps) return y < o.y;
    return x < o.x;
  }
  point rotate(double alpha) {
    alpha = alpha * pi / 180;
    return point(x * cos(alpha) - y * sin(alpha),
                 x * sin(alpha) + y * cos(alpha));
  }
  bool operator==(const point& o) const {
    return fabs(x - o.x) < eps && fabs(y - o.y) < eps;
  }
};
bool onSegment(point p, point q, point r) {
  if (q.x <= max(p.x, r.x) && q.x >= min(p.x, r.x) && q.y <= max(p.y, r.y) &&
      q.y >= min(p.y, r.y))
    return true;
  return false;
}
int orientation(point p, point q, point r) {
  double val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  if (fabs(val) < eps) return 0;
  return (val > eps) ? 1 : 2;
}
point lineLineIntersection(point A, point B, point C, point D) {
  double a1 = B.y - A.y;
  double b1 = A.x - B.x;
  double c1 = a1 * (A.x) + b1 * (A.y);
  double a2 = D.y - C.y;
  double b2 = C.x - D.x;
  double c2 = a2 * (C.x) + b2 * (C.y);
  double determinant = a1 * b2 - a2 * b1;
  if (determinant == 0) {
    puts("FAILED");
    return point(0, 0);
  } else {
    double x = (b2 * c1 - b1 * c2) / determinant;
    double y = (a1 * c2 - a2 * c1) / determinant;
    return point(x, y);
  }
}
bool intersect(point p1, point q1, point p2, point q2, point& res) {
  int o1 = orientation(p1, q1, p2);
  int o2 = orientation(p1, q1, q2);
  int o3 = orientation(p2, q2, p1);
  int o4 = orientation(p2, q2, q1);
  if (o1 != o2 && o3 != o4) {
    res = lineLineIntersection(p1, q1, p2, q2);
    return true;
  }
  if (o1 == 0 && onSegment(p1, p2, q1)) {
    res = p2;
    return true;
  }
  if (o2 == 0 && onSegment(p1, q2, q1)) {
    res = q2;
    return true;
  }
  if (o3 == 0 && onSegment(p2, p1, q2)) {
    res = p1;
    return true;
  }
  if (o4 == 0 && onSegment(p2, q1, q2)) {
    res = q1;
    return true;
  }
  return false;
}
bool same(vector<point> a, vector<point> b) {
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  return a == b;
}
double ccw(point O, point A, point B) {
  return (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x);
}
vector<point> convex_hull(vector<point> pts) {
  vector<point> up, lo;
  sort(pts.begin(), pts.end());
  for (int i = 0; i < pts.size(); i++) {
    while (lo.size() >= 2 &&
           ccw(lo[lo.size() - 2], lo[lo.size() - 1], pts[i]) <= eps)
      lo.pop_back();
    lo.push_back(pts[i]);
  }
  for (int i = pts.size() - 1; i >= 0; i--) {
    while (up.size() >= 2 &&
           ccw(up[up.size() - 2], up[up.size() - 1], pts[i]) <= eps)
      up.pop_back();
    up.push_back(pts[i]);
  }
  up.pop_back();
  lo.pop_back();
  vector<point> ch;
  for (auto x : lo) ch.push_back(x);
  for (auto x : up) ch.push_back(x);
  ch.push_back(ch[0]);
  return ch;
}
int main() {
  double h, w, alpha;
  cin >> w >> h >> alpha;
  vector<point> rec;
  rec.push_back(point(w / 2, h / 2));
  rec.push_back(point(-w / 2, h / 2));
  rec.push_back(point(-w / 2, -h / 2));
  rec.push_back(point(w / 2, -h / 2));
  rec.push_back(rec[0]);
  vector<point> rot;
  for (auto p : rec) rot.push_back(p.rotate(alpha));
  if (same(rec, rot)) {
    cout << fixed << setprecision(8) << w * h << endl;
    return 0;
  }
  vector<point> all;
  for (int i = 0; i < rec.size() - 1; i++) {
    for (int j = 0; j < rot.size() - 1; j++) {
      point p;
      bool can = intersect(rec[i], rec[i + 1], rot[j], rot[j + 1], p);
      if (can) all.push_back(p);
    }
  }
  all = convex_hull(all);
  double area = 0.0;
  for (int i = 0; i < all.size() - 1; i++) {
    area += (all[i].x + all[i + 1].x) * (all[i].y - all[i + 1].y);
  }
  cout << fixed << setprecision(8) << fabs(area / 2.0) << endl;
}
