#include<bits/stdc++.h>
#define range(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,b) for(int i = 0; i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define show(x) cerr << #x << " = " << (x) << endl;
//const int INF = 1e8;
using namespace std;
typedef complex<double> Point;
typedef Point Vector;
struct Segment{ Point p1, p2; };
typedef Segment Line;
double cross(Point a, Point b){
return (a.real() * b.imag() - a.imag() * b.real());
}
Point intersectionL(Point a1, Point a2, Point b1, Point b2){
Point a = a2 - a1; Point b = b2 - b1;
return a1 + a* cross(b, b1 - a1) / cross(b, a);
}
Point intersectionL(Line l1, Line l2){
return intersectionL(l1.p1, l1.p2, l2.p1, l2.p2);
}
double x, y, z;
bool C(double mid){
Point A = Point{0,x};
Point C = Point{y,0};
Point P = Point{0,mid};
Point Q = Point{y,mid * 2};
Line l1 = Line{P,Q};
Line l2 = Line{A,C};
Point crs = intersectionL(l1, l2);
double ver = z / abs(A - C) * y;
double hol = z / abs(A - C) * x;
//show(crs)
Point Z = Point{hol, x - ver};
//show(abs(crs - A))
return abs(crs - A) < abs(Z - A);
}
int main(){
cin >> x >> y >> z;
double right = x, left = 0;
rep(i,200){
double mid = (right + left ) / 2;
if(C(mid)) right = mid;
else left = mid;
}
//show(right)
cout << fixed << setprecision(10) << x - right << endl;
}