Problem: The determinant of a matrix 2 × 2 is defined as follows:

<image>

A matrix is called degenerate if its determinant is equal to zero. 

The norm ||A|| of a matrix A is defined as a maximum of absolute values of its elements.

You are given a matrix <image>. Consider any degenerate matrix B such that norm ||A - B|| is minimum possible. Determine ||A - B||.

Input

The first line contains two integers a and b (|a|, |b| ≤ 109), the elements of the first row of matrix A. 

The second line contains two integers c and d (|c|, |d| ≤ 109) the elements of the second row of matrix A.

Output

Output a single real number, the minimum possible value of ||A - B||. Your answer is considered to be correct if its absolute or relative error does not exceed 10 - 9.

Examples

Input

1 2
3 4


Output

0.2000000000


Input

1 0
0 1


Output

0.5000000000

Note

In the first sample matrix B is <image>

In the second sample matrix B is <image>

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;
public class LookseryC {
    BufferedReader br;
    PrintWriter out;
    StringTokenizer st;
    boolean eof;
    void solve() throws IOException {
        long a0 = nextLong();
        long a1 = nextLong();
        long a2 = nextLong();
        long a3 = nextLong();
        
        if(a0 * a3 == a1 * a2) {
            System.out.println(0);
            return;
        }
        double l = 0.0;
        double h = 1000 * 1000 * 1000.0;
        for(int i = 0; i < 1000; i++) {
            double mid = (l + h) / 2;
            double[] seg1 = getMax(a0, a3, mid);
            double[] seg2 = getMax(a1, a2, mid);
            boolean tp = getBool(seg1, seg2);
            if(tp) 
                h = mid;
            else
                l = mid;
        }
        System.out.print((l + h) / 2);
        
    }
    public double[] getMax(double a0, double a1, double mid) {
        double[] res = new double[2];
        double[] v = new double[4];
        v[0] = (a0 - mid) * (a1 - mid);
        v[1] = (a0 - mid) * (a1 + mid);
        v[2] = (a0 + mid) * (a1 + mid);
        v[3] = (a0 + mid) * (a1 - mid);
        res[0] = Double.MAX_VALUE;
        res[1] = -Double.MAX_VALUE;
        for(int i = 0; i < 4; i++) {
            res[0] = Math.min(res[0], v[i]);
            res[1] = Math.max(res[1], v[i]);
        }
        return res;
    }
    public boolean getBool(double[] seg1, double[] seg2) {
        if(seg1[0] > seg2[1])
            return false;
        if(seg1[1] < seg2[0])
            return false;
        return true;
    }
    
    
    public LookseryC() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        out = new PrintWriter(System.out);
        solve();
        out.close();
    }
    public static void main(String[] args) throws IOException {
        new LookseryC();
    }
    public String nextToken() {
        while (st == null || !st.hasMoreTokens()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (Exception e) {
                eof = true;
                return null;
            }
        }
        return st.nextToken();
    }
    public String nextString() {
        try {
            return br.readLine();
        } catch (IOException e) {
            eof = true;
            return null;
        }
    }
    public int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }
    public long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }
    public double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }
}