#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// #define ordered_set tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
#define int long long int
#define endl "\n"
#define MOD 1000000007
#define mod 1000000007
#define M 1000000007
#define pb push_back
#define take(a,b,c) for(int b=0;b<c;b++) cin>>a[b]
#define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define mx 1000005
#define fiint(a,b) memset(a,b,sizeof(a))
#define bitcount __builtin_popcount
#define fori(i,a,b) for(int i=a;i<b;i++)
#define ford(i,a,b) for(int i=a;i>=b;i--)
#define debug(x) cout<<x<<endl;
#define cases(t) int t; cin>>t; while(t--)
#define inf1 INT_MAX
#define all(a) a.begin(),a.end()
#define vec vector<int>
#define pii pair<int,int>
#define plii pair<int,int>
#define pint pair<int,int>
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define bs binary_search
#define mp make_pair
 
#define sz(x) (int)x.size()
#define PI    3.14159265359

//const long long INF=1e18;

bool chmin(int& a, int b){ if(a > b){ a = b; return 1; } return 0; }

 
int factorial[10000001]={0};
 
int gcd(int a, int b){
    if (b == 0)
        return a;
    return gcd(b, a % b);
}


int powerFunction(int x,int y){
    int res = 1;
     int p = mod;
    x = x;
    while (y > 0){
        if (y & 1)
            res = (res*x)%p ;
        y = y>>1;
        x = (x*x)%p ;
    }
    return res;
}

void factorialFunction(int maxLimit){
    factorial[0]=1;
    for(int i=1 ; i <= maxLimit ; i++)
    factorial[i]=(factorial[i-1]*i)%MOD;
    return;
}
 
int nCr(int n, int r)
{
    if(r < 0 || r > n){
        return 0;
    }
    int temp = factorial[n];
    temp *= (powerFunction(factorial[r], MOD-2)%MOD);
    temp %= MOD;
    temp *= (powerFunction(factorial[n-r], MOD-2)%MOD);
    temp %= MOD;
    return temp;
}


double dp[101][101][101];

double find(int i ,int j ,int k)
{
    if(i == 100 || j == 100 || k == 100   ) return 0;
    if(dp[i][j][k] != -1)
        return dp[i][j][k];
    double a = ( (double)i / (double) (i + j + k) ) * (find(i+1 , j , k) + 1);
    double b = ( (double)j / (double)(i + j + k) ) * (find(i , j+1 , k) + 1);
    double c = ( (double)k / (double) (i + j + k) ) * (find(i, j , k+1) + 1);
    dp[i][j][k] = a + b + c;
    return dp[i][j][k];
}

signed main()
{
    int a , b , c ; cin>>a>>b>>c;
    for(int i = 0 ; i  <= 100 ; i++)
        for(int j = 0 ; j <= 100 ; j++)
            for(int k = 0 ; k <= 100 ; k++)
                dp[i][j][k] = -1;
    cout<<setprecision(8)<<find(a , b , c)<<endl;
    
}
    



#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<set>
//#include<bits/stdc++.h>
#define int long long
constexpr long long mod = 1000000007;
#define for0(i, n) for(int i = 0; i < (n); i++)
#define for1(i, n) for(int i = 1; i <= (n);i++)
#define mp make_pair
#define all(x) x.begin(),x.end()
#define puts(x) cout << (x) << "\n"
using namespace std;
int input() {
	int r; cin >> r; //scanf("%lld", &r); 
	return r;
}
double p[120][120][120], ans; int a, b, c;
signed main() {
	cin >> a >> b >> c;
	p[a][b][c] = 1;
	for (int i = a; i <= 100; i++)for (int j = b; j <= 100; j++)for (int k = c; k <= 100; k++) {
		if ((i - 100) * (j - 100) * (k - 100) == 0)ans += p[i][j][k] * (i + j + k - a - b - c);
		else {
			p[i + 1][j][k] += p[i][j][k] * (double)i / (i + j + k);
			p[i][j + 1][k] += p[i][j][k] * (double)j / (i + j + k);
			p[i][j][k + 1] += p[i][j][k] * (double)k / (i + j + k);
		}
	}
	printf("%.10f\n", ans);
}