#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const int oo = 0x3f3f3f3f;
const int maxn = 2100;
int n, m;
double f[maxn + 5][maxn + 5];
int main() {
  scanf("%d%d", &n, &m);
  f[0][0] = 1;
  for (int ipj = (1), ipj_end_ = (n + m + 1); ipj < ipj_end_; ++ipj) {
    for (int i = (0), i_end_ = (ipj + 1); i < i_end_; ++i) {
      int j = ipj - i;
      if (!i)
        f[i][j] = 1. / (j + 1);
      else if (!j)
        f[i][j] = 1;
      else {
        double &u = f[j][i - 1], &v = f[j - 1][i];
        double invnj = 1. / (j + 1);
        double a = u + invnj, b = (1 - u - (1 + j - j * v) * invnj), c = -invnj,
               d = (1 + j - j * v) * invnj;
        f[i][j] = invnj;
        double mid = -c / a;
        if (mid > 0) {
          if (a + b < 0)
            chkmax(f[i][j], c + d);
          else
            chkmax(f[i][j], (a + b) * mid + c + d);
        }
        if (mid < 1) {
          if (b < 0)
            chkmax(f[i][j], b * mid + d);
          else
            chkmax(f[i][j], b + d);
        }
      }
    }
  }
  printf("%.15f %.15f\n", f[n][m], 1 - f[n][m]);
  return 0;
}
