#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
const int MAX = 1e7;
double pi = 3.1415926535897932384626433832795;
const long long inf = 1e10;
void Build(int *tree, int st, int ed, int node) {
  if (st == ed) {
    tree[node] = 0;
    return;
  }
  int mid = (st + ed) / 2;
  Build(tree, st, mid, 2 * node + 1);
  Build(tree, mid + 1, ed, 2 * node + 2);
}
int *make_tree(int N) {
  int x = ceil(log2(N));
  int size = 2 * pow(2, x) - 1;
  int *tree = new int[size];
  Build(tree, 0, N - 1, 0);
  return tree;
}
int Query(int *tree, int st, int ed, int node, int l, int r) {
  if (ed < l || st > r || l > r) return 0;
  if (l <= st && ed <= r) return tree[node];
  int mid = (st + ed) / 2;
  return Query(tree, st, mid, 2 * node + 1, l, r) +
         Query(tree, mid + 1, ed, 2 * node + 2, l, r);
}
void update(int *tree, int st, int ed, int node, int index, int val) {
  if (st == ed) {
    tree[node] = val;
    return;
  }
  int mid = (st + ed) / 2;
  if (index >= st && index <= mid)
    update(tree, st, mid, 2 * node + 1, index, val);
  else
    update(tree, mid + 1, ed, 2 * node + 2, index, val);
  tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
double powr(double a, double b) {
  if (b == 0) return 1.0;
  double x = powr(a, b / 2);
  x *= x;
  if ((int)b % 2) return a * x;
  return x;
}
int main() {
  double a, b, c, d;
  cin >> a >> b >> c >> d;
  double p = a / b, q = c / d;
  double f = (1 - p) * (1 - q);
  printf("%.12lf\n", p / (1 - f));
}
