#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
#include<vector>
#include<complex>
#include<cstdio>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
typedef long long ll;
typedef complex<double> P;
const double eps = 1e-10;
const double pi = acos(-1);
 
bool isp(P a,P b,P c){
  return abs(a-c) + abs(b-c) < abs(a-b)+1e-10;
}

double Polygon_Area(const P *a,int n){
  double sum = 0;
 for(int i=0;i<n;i++){
   sum += (a[i%n].real()-a[(i+1)%n].real())*(a[i%n].imag()+a[(i+1)%n].imag());
 }
 if (sum < 0)sum *= -1;
 return (double)(sum/2.0);
}

double trArea(P a,P b,P c){
  P in[3] ={a,b,c};
  return Polygon_Area(in,3);
}

P lineCircleIntersection(double dx,double dy,double rx,double ry,double r){
  double a=(dx*dx+dy*dy),b=-2*rx*dx-2*ry*dy,c=rx*rx+ry*ry-r*r;
  double D=b*b-4*a*c;
  if (D < 0)return -1;
  double t = (-b+sqrt(D))/(2*a);
  //return P(rx,ry) + P(dx,dy)*t;
  return P(dx,dy)*t;
}

double sectorArea(double r,P b,P c){
  double ang  = arg(c)-arg(b);
  if (ang < 0)ang += 2*pi;
  double area = pi*r*r;
  return area * ang /(2*pi);
}

double compute(double w,double h,double r){
  const P rp(w/2,h/2),A=rp,O(0,0);
  /*case 1*/
  P a(-1,0),b(0,-1);//a:w, b:h
  P B = lineCircleIntersection(-1,0,rp.real(),rp.imag(),r);
  P C = lineCircleIntersection(0,-1,rp.real(),rp.imag(),r);
  if (isp(P(0,0),P(-w/2,0),B) && isp(P(0,0),P(0,-h/2),C)){
    double sa = sectorArea(r,B-A,C-A);
    double ta = trArea(A,B,C);
    double tb = trArea(O,B,C);
    return sa-ta + tb;
  }
  b = P(0,-h/2);
  P tr = rp-b;
  C = lineCircleIntersection(-1,0,tr.real(),tr.imag(),r);
  C += b;
  if (C.real() < -w/2)C.real() = -w/2;
  if (C.imag() < -h/2)C.imag() = -h/2;

  if (isp(P(0,0),P(-w/2,0),B) && isp(P(0,-h/2),P(-w/2,-h/2),C)){
    P D(0,-h/2);
    double sa = sectorArea(r,B-A,C-A);
    double ta = trArea(A,B,C);
    double tb = trArea(B,C,O);
    double tc = trArea(C,O,D);
    return sa-ta + tb + tc;
  }

  a = P(-w/2,0);
  P tr2 = rp-a;
  B = lineCircleIntersection(0,-1,tr2.real(),tr2.imag(),r);
  B += a;

  if (B.real() < -w/2)B.real() = -w/2;
  if (B.imag() < -h/2)B.imag() = -h/2;

  P E(0,-h/2),F(-w/2,0);
  double sa = sectorArea(r,B-A,C-A);
  double ta = trArea(A,B,C);
  double tb = trArea(B,C,O);
  double tc = trArea(C,O,E);
  double td = trArea(O,F,B);
  return sa-ta + tb + tc + td;
}

main(){
  double w,h,s;
  while(cin>>w>>h>>s && w){
    if (w < h)swap(w,h);
    /*
      ツ板シツ径ツづ債禿アツ閉ェツ探ツ催オツつキツづゥツ。
      ツ閉「ツづュツづェツづゥツ姪環静渉づ債青ァツ度ツつェツ津。ツつ「ツづ個づ閉ェツ環督敖篠。ツづ仰づ淞づゥツ。
      ツ督堋つヲツづ債４ツ倍ツつキツづゥツ。
     */
    //double r = sqrt(2);
    /*
    double l = sqrt(w*w+h*h)/2,r = sqrt(w*w+h*h);
    double ans;
    rep(i,200){
      double mid = (r+l)/2;
      double area = compute(w,h,mid);
      area *= 4;
      if (abs(area-s) < eps)ans = mid;
      if (area > s){
	r = mid-1e-12;
      }else{
	l = mid+1e-12;
      }
    }
    printf("%.3lf\n",ans*ans*4);
    */

    double l = sqrt(w*w+h*h)/2,r = sqrt(w*w+h*h);
    l = l*l;
    r = r*r;
    double ans;
    rep(i,200){
      double mid = (r+l)/2;
      double area = compute(w,h,sqrt(mid));
      area *= 4;
      if (abs(area-s) < eps)ans = mid;
      if (area > s){
	r = mid-1e-10;
      }else{
	l = mid+1e-10;
      }
    }
    printf("%.3lf\n",ans*4);



  }
}

Measured memory_bytes: 0