#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point(double a, double b) { x = a, y = b; }
  Point() {}
};
Point operator+(Point A, Point B) { return Point(A.x + B.x, A.y + B.y); }
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
Point operator*(double k, Point A) { return Point(A.x * k, A.y * k); }
bool operator<(Point A, Point B) {
  if (fabs(A.x - B.x) < 1e-8) return A.y < B.y;
  return A.x < B.x;
}
double cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double area(Point A, Point B, Point C) { return cross(B - A, C - A); }
Point getRotado(Point P, double ang) {
  double x = P.x * cos(ang) - P.y * sin(ang);
  double y = P.x * sin(ang) + P.y * cos(ang);
  return Point(x, y);
}
bool onSegment(Point A, Point B, Point C) {
  bool ok = 0;
  if (fabs(cross(B - A, C - A)) < 1e-8) ok = 1;
  if (ok) {
    double minx = min(A.x, B.x), maxx = max(A.x, B.x);
    double miny = min(A.y, B.y), maxy = max(A.y, B.y);
    return C.x + 1e-8 >= minx && C.x <= maxx + 1e-8 && C.y + 1e-8 >= miny &&
           C.y <= maxy + 1e-8;
  }
  return 0;
}
bool interSegment(Point P1, Point P2, Point P3, Point P4) {
  double A1 = cross(P2 - P1, P3 - P1);
  double A2 = cross(P2 - P1, P4 - P1);
  double A3 = cross(P4 - P3, P2 - P3);
  double A4 = cross(P4 - P3, P1 - P3);
  if (((A1 > 0 && A2 < 0) || (A1 < 0 && A2 > 0)) &&
      ((A3 > 0 && A4 < 0) || (A3 < 0 && A4 > 0)))
    return 1;
  if (onSegment(P2, P1, P3)) return 1;
  if (onSegment(P2, P1, P4)) return 1;
  if (onSegment(P3, P4, P1)) return 1;
  if (onSegment(P3, P4, P2)) return 1;
  return 0;
}
Point lineIntersection(Point A, Point B, Point C, Point D) {
  double s = cross(C - A, D - C) / cross(B - A, D - C);
  return A + s * (B - A);
}
double area(const vector<Point> &P) {
  int n = P.size();
  double A = 0;
  for (int i = 1; i <= n - 2; i++) A += area(P[0], P[i], P[i + 1]);
  return abs(A / 2);
}
vector<Point> ConvexHull(vector<Point> P) {
  sort(P.begin(), P.end());
  int n = P.size(), k = 0;
  Point H[2 * n];
  for (int i = 0; i < n; ++i) {
    while (k >= 2 && area(H[k - 2], H[k - 1], P[i]) <= 0) --k;
    H[k++] = P[i];
  }
  for (int i = n - 2, t = k; i >= 0; --i) {
    while (k > t && area(H[k - 2], H[k - 1], P[i]) <= 0) --k;
    H[k++] = P[i];
  }
  return vector<Point>(H, H + k - 1);
}
int main() {
  long long w, h, a;
  cin >> w >> h >> a;
  if (a == 0 || a == 180) {
    printf("%.10lf\n", (double)(w * h));
  } else {
    Point P[4], PR[4];
    double ang = (a * (2 * acos(0.0))) / 180;
    P[0] = Point(w / 2.0, h / 2.0);
    P[1] = Point(-w / 2.0, h / 2.0);
    P[2] = Point(-w / 2.0, -h / 2.0);
    P[3] = Point(w / 2.0, -h / 2.0);
    for (int i = 0; i < 4; ++i) {
      PR[i] = getRotado(P[i], ang);
    }
    vector<Point> Polig;
    for (int i = 0; i < 4; ++i) {
      for (int j = 0; j < 4; ++j) {
        if (interSegment(P[i], P[(i + 1) % 4], PR[j], PR[(j + 1) % 4])) {
          Polig.push_back(
              lineIntersection(P[i], P[(i + 1) % 4], PR[j], PR[(j + 1) % 4]));
        }
      }
    }
    vector<Point> Convex = ConvexHull(Polig);
    printf("%.10lf\n", area(Convex));
  }
}
