#include <bits/stdc++.h>
using namespace std;
using Graph = vector<vector<long long>>;
const long long INF = 1LL <<60;
const long long Mo=1000000007;
     
     
vector<long long> seen;
void dfs(const Graph &G, int v, long long cnt) {
  seen[v] = cnt;	//判定だけならcntをboolに
  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v]>=0) continue; // next_v が探索済だったらスルー
    dfs(G, next_v, cnt); // 再帰的に探索
  }
}
     
long long gcn(long long x,long long y){
  if(x%y==0){
    return y;  
  }
  else{
    return gcn(y,x%y);
  }
}
     
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}  
int main(void){
  long long tmp=0;
  long long i,j,k,t;
  double sx,sy,gx,gy;
  double res;
  
  cin>>sx>>sy>>gx>>gy;
  res=sx+(gx-sx)*sy/(sy+gy);
    

  cout<<setprecision(15)<<res<<endl;
  //cout<<res<<endl;
      
  return 0;
}

/*
Graph G(n);
seen.assign(n,-1);
for(i=0; i<m; i++) {
  cin>>tmp1>>tmp2;
  tmp1--;
  tmp2--;
  G[tmp1].push_back(tmp2);
  G[tmp2].push_back(tmp1);
}
*/
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)

int main() {
    int sx, sy, gx, gy;
    cin >> sx >> sy >> gx >> gy;
    if(sx == gx) {
        cout << sx << endl;
    }
    else {
        printf("%lf", sx - sy * ((double)(sx - gx) / (double)(sy + gy)));
    }
}