#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
inline int my_getchar_unlocked(){
  static char buf[1048576];
  static int s = 1048576;
  static int e = 1048576;
  if(s == e && e == 1048576){
    e = fread_unlocked(buf, 1, 1048576, stdin);
    s = 0;
  }
  if(s == e){
    return EOF;
  }
  return buf[s++];
}
inline void rd(int &x){
  int k;
  int m=0;
  x=0;
  for(;;){
    k = my_getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = my_getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
struct MY_WRITER{
  char buf[1048576];
  int s;
  int e;
  MY_WRITER(){
    s = 0;
    e = 1048576;
  }
  ~MY_WRITER(){
    if(s){
      fwrite_unlocked(buf, 1, s, stdout);
    }
  }
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked(int a){
  if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){
    fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);
    MY_WRITER_VAR.s = 0;
  }
  MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;
}
inline void wt_L(char a){
  my_putchar_unlocked(a);
}
int WRITER_DOUBLE_DIGIT = 15;
inline int writerDigit_double(){
  return WRITER_DOUBLE_DIGIT;
}
inline void writerDigit_double(int d){
  WRITER_DOUBLE_DIGIT = d;
}
inline void wt_L(double x){
  const int d = WRITER_DOUBLE_DIGIT;
  int k;
  int r;
  double v;
  if(x!=x || (x==x+1 && x==2*x)){
    my_putchar_unlocked('E');
    my_putchar_unlocked('r');
    my_putchar_unlocked('r');
    return;
  }
  if(x < 0){
    my_putchar_unlocked('-');
    x = -x;
  }
  x += 0.5 * pow(0.1, d);
  r = 0;
  v = 1;
  while(x >= 10*v){
    v *= 10;
    r++;
  }
  while(r >= 0){
    r--;
    k = floor(x / v);
    if(k >= 10){
      k = 9;
    }
    if(k <= -1){
      k = 0;
    }
    x -= k * v;
    v *= 0.1;
    my_putchar_unlocked(k + '0');
  }
  if(d > 0){
    my_putchar_unlocked('.');
    v = 1;
    for(r=(0);r<(d);r++){
      v *= 0.1;
      k = floor(x / v);
      if(k >= 10){
        k = 9;
      }
      if(k <= -1){
        k = 0;
      }
      x -= k * v;
      my_putchar_unlocked(k + '0');
    }
  }
}
double dp[101][101][101];
int main(){
  int i;
  int A;
  rd(A);
  int B;
  rd(B);
  int C;
  rd(C);
  for(i=(100)-1;i>=(A);i--){
    int j;
    for(j=(100)-1;j>=(B);j--){
      int k;
      for(k=(100)-1;k>=(C);k--){
        if(i+j+k > 0){
          dp[i][j][k] = 1 + (dp[i+1][j][k] * i + dp[i][j+1][k] * j + dp[i][j][k+1] * k) / (i+j+k);
        }
      }
    }
  }
  wt_L(dp[A][B][C]);
  wt_L('\n');
  return 0;
}
// cLay version 20201123-1

// --- original code ---
// double dp[101][101][101];
// {
//   int @A, @B, @C;
//   rrep(i,A,100) rrep(j,B,100) rrep(k,C,100) if(i+j+k > 0){
//     dp[i][j][k] = 1 + (dp[i+1][j][k] * i + dp[i][j+1][k] * j + dp[i][j][k+1] * k) / (i+j+k);
//   }
//   wt(dp[A][B][C]);
// }

#include <iostream>
#include <iomanip>
using namespace std;

long double dp[100][100][100];

long double solve(int a, int b, int c, int cnt) {
	// basis
	if (a == 100 || b == 100 || c == 100)
	{
		return cnt;
	}

	if (dp[a][b][c] != 0)
	{
		return dp[a][b][c];
	}

	long double ret = 0;

	// a + 1
	ret += solve(a + 1, b, c, cnt + 1) * a / (a + b + c);

	// b + 1
	ret += solve(a, b + 1, c, cnt + 1) * b / (a + b + c);

	// c + 1
	ret += solve(a, b, c + 1, cnt + 1) * c / (a + b + c);

	return  dp[a][b][c] = ret;
}

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	cout << setprecision(12) << solve(a, b, c, 0) << endl;
}