#include <numeric>
#include <bits/stdc++.h>
#include <utility>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <math.h>
#include <string>
#define ll long long
#define ull unsigned long long
#define make(type,x) type x; cin>>x
#define make2(type,x,y) type x,y; cin>>x>>y
#define fr(x,y) for(long long x=0;x<y;x++)
#define makevec(x,y,n) vector <x> y(n); for(ll i=0;i<n;i++) cin>>y[i]
#define M (ll)1000000007
#define MM (ll) 1e8
#define INF (ll) 1e18

# define IOS ios_base::sync_with_stdio(false); cin.tie(NULL)


using namespace std;


template <typename T>
T modpow(T base, T exp, T modulus) {
  base %= modulus;
  T result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}
bool sortbysec(const ll &a, const ll &b){
    return abs(a)>abs(b);
}

struct cmp {
	bool operator() (const pair<int, int> &a, const pair<int, int> &b) const {
		int lena = a.second - a.first + 1;
		int lenb = b.second - b.first + 1;
		if (lena == lenb) return a.first < b.first;
		return lena > lenb;
	}
};


struct c_h {
    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        x ^= FIXED_RANDOM;
        return x ^ (x >> 16);
    }
};

ll calcpow(ll x, ll y)
{
    ll temp;
    if(y == 0)
        return 1;
    temp = calcpow(x, y / 2);
    if (y % 2 == 0)
        return temp * temp;
    else
    {
        if(y > 0)
            return x * temp * temp;
        else
            return (temp * temp) / x;
    }
}
ll gcd(ll a, ll b){
    if(b==0) return a;
    return gcd(b,a%b);

}
ll egcd(ll a, ll b, ll &x,ll &y){
    if(b==0){
        x=1;
        y=0;
        return a;
    }
    ll x1;
    ll y1;
    ll g=egcd(b,a%b,x1,y1);
    x=y1;
    y=x1-y1*(a/b);
    return g;
}


bool isprime(ll a){
bool flag=1;
for(ll i=2;i*i<=a;i++){
    if(a%i==0) {flag=0; break;}
}
return flag;
}

ll dx8[8]={1,0,-1,0,1,-1,1,-1};
ll dy8[8]={0,1,0,-1,1,-1,-1,1};
ll dx4[4]={0,0,1,-1};
ll dy4[4]={1,-1,0,0};
const ll N=100;
double dp[N][N][N];
double solve(ll a, ll b, ll c){
    if(a==100 || b==100 || c==100) return 0;
    if(dp[a][b][c]!=-1) return dp[a][b][c];
    dp[a][b][c]=1+(1.0*a/(a+b+c))*solve(a+1,b,c) + (1.0*b/(a+b+c))*solve(a,b+1,c) + (1.0*c/(a+b+c))*solve(a,b,c+1);
    return dp[a][b][c];
}


int main(){
    IOS;
    fr(i,100) fr(j,100) fr(k,100) dp[i][j][k]=-1;
    make2(ll,a,b); make(ll,c);
    cout<<setprecision(10)<<solve(a,b,c)<<endl;


    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define double long double
#define x first
#define y second
#define pb push_back
#define rt return
using namespace std;
double dp[110][110][110];
double solve(int a,int b,int c){
	if (a==100||b==100||c==100) return dp[a][b][c]=0.0;
	if (dp[a][b][c]!=-1.0) return dp[a][b][c];
	double m1=solve(a+1,b,c)+1.0,m2=solve(a,b+1,c)+1.0,m3=solve(a,b,c+1)+1.0;
	double s=0.0+a+b+c;
	return dp[a][b][c]=m1*a/s+m2*b/s+m3*c/s;
}
signed main(){
	for (int i=0; i<110; i++){
		for (int j=0; j<110; j++){
			for (int k=0; k<110; k++) dp[i][j][k]=-1.0;
		}
	}
	int a,b,c;
	cin>>a>>b>>c;
	cout<<fixed<<setprecision(8)<<solve(a,b,c);
}