#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point() {}
  Point(double a, double b) {
    x = a;
    y = b;
  }
  double mod2() { return x * x + y * y; }
  double mod() { return sqrt(x * x + y * y); }
  double arg() { return atan2(y, x); }
  Point ort() { return Point(-y, x); }
  Point unit() {
    double k = mod();
    return Point(x / k, y / k);
  }
};
Point operator+(const Point &a, const Point &b) {
  return Point(a.x + b.x, a.y + b.y);
}
Point operator-(const Point &a, const Point &b) {
  return Point(a.x - b.x, a.y - b.y);
}
Point operator/(const Point &a, double k) { return Point(a.x / k, a.y / k); }
Point operator*(const Point &a, double k) { return Point(a.x * k, a.y * k); }
bool operator==(const Point &a, const Point &b) {
  return fabs(a.x - b.x) < 1e-6 && fabs(a.y - b.y) < 1e-6;
}
bool operator!=(const Point &a, const Point &b) { return !(a == b); }
bool operator<(const Point &a, const Point &b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
double cross(const Point &A, const Point &B) { return A.x * B.y - A.y * B.x; }
double area(const Point &A, const Point &B, const Point &C) {
  return cross(B - A, C - A);
}
double Area(vector<Point> v) {
  int n = (int)v.size();
  double res = 0;
  for (int i = 1; i <= n - 2; i++) {
    double y = area(v[0], v[i], v[i + 1]);
    res += y;
  }
  return abs(res / 2);
}
bool between(const Point &A, const Point &B, const Point &P) {
  return P.x + 1e-6 >= min(A.x, B.x) && P.x <= max(A.x, B.x) + 1e-6 &&
         P.y + 1e-6 >= min(A.y, B.y) && P.y <= max(A.y, B.y) + 1e-6;
}
bool onSegment(const Point &A, const Point &B, const Point &P) {
  return abs(area(A, B, P)) < 1e-6 && between(A, B, P);
}
bool intersects(const Point &P1, const Point &P2, const Point &P3,
                const Point &P4) {
  double A1 = area(P3, P4, P1);
  double A2 = area(P3, P4, P2);
  double A3 = area(P1, P2, P3);
  double A4 = area(P1, P2, P4);
  if (((A1 > 0 && A2 < 0) || (A1 < 0 && A2 > 0)) &&
      ((A3 > 0 && A4 < 0) || (A3 < 0 && A4 > 0)))
    return true;
  else if (A1 == 0 && onSegment(P3, P4, P1))
    return true;
  else if (A2 == 0 && onSegment(P3, P4, P2))
    return true;
  else if (A3 == 0 && onSegment(P1, P2, P3))
    return true;
  else if (A4 == 0 && onSegment(P1, P2, P4))
    return true;
  else
    return false;
}
Point lineIntersection(const Point &A, const Point &B, const Point &C,
                       const Point &D) {
  return A + (B - A) * (cross(C - A, D - C) / cross(B - A, D - C));
}
vector<Point> inter(vector<Point> a, vector<Point> b) {
  int n = (int)a.size(), m = (int)b.size();
  vector<Point> I;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (intersects(a[i], a[(i + 1) % n], b[j], b[(j + 1) % m])) {
        Point u = lineIntersection(a[i], a[(i + 1) % n], b[j], b[(j + 1) % m]);
        I.push_back(u);
      }
    }
  return I;
}
vector<Point> ConvexHull(vector<Point> Poly) {
  sort(Poly.begin(), Poly.end());
  int nP = Poly.size(), k = 0;
  Point H[2 * nP];
  for (int i = 0; i < nP; ++i) {
    while (k >= 2 && area(H[k - 2], H[k - 1], Poly[i]) <= 0) --k;
    H[k++] = Poly[i];
  }
  for (int i = nP - 2, t = k; i >= 0; --i) {
    while (k > t && area(H[k - 2], H[k - 1], Poly[i]) <= 0) --k;
    H[k++] = Poly[i];
  }
  if (k == 0) return vector<Point>();
  return vector<Point>(H, H + k - 1);
}
double angulo(double r) {
  if (r < 0) r += 2 * 3.14159265;
  return r;
}
int main() {
  double w, h, a;
  cin >> w >> h >> a;
  if (abs(a) < 1e-6) {
    printf("%f\n", w * h);
    return 0;
  }
  vector<Point> v;
  v.push_back(Point(h / 2, w / 2));
  v.push_back(Point(-h / 2, w / 2));
  v.push_back(Point(-h / 2, -w / 2));
  v.push_back(Point(h / 2, -w / 2));
  double x, y, x2, y2;
  vector<Point> v2;
  for (int i = 0; i < 4; i++) {
    x = (double)v[i].x, y = (double)v[i].y;
    x2 = x * cos((double)a * 3.14159265 / 180.0) -
         y * sin((double)a * 3.14159265 / 180.0);
    if (abs(x2) <= 1e-6) x2 = 0;
    y2 = x * sin((double)a * 3.14159265 / 180.0) +
         y * cos((double)a * 3.14159265 / 180.0);
    if (abs(y2) <= 1e-6) y2 = 0;
    v2.push_back(Point(x2, y2));
  }
  vector<Point> C = inter(v, v2);
  vector<Point> D;
  D = ConvexHull(C);
  printf("%f\n", Area(D));
  return 0;
}
