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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;


public class H{
        static InputReader in;
        static PrintWriter out;
        static long a,b,c,d;
    
    public static boolean isGood(double l){
        double[] lx= {l, -l};
        double[] ly= {l,-l};
        for(int i=0; i<2; i++){
            a^=c;
            c^=a;
            a^=c;
            b^=d;
            d^=b;
            b^=d;
        for(double dx : lx){
            for(double dy: ly){
                double x= a+dx;
                double y= b+dy;
                double x1,y1,x2,y2; 
                x1= c-l;
                y1=d+l;
                x2= c+l;
                y2= d-l;
                
                if( (y*x1) > (y1*x) && (y2*x) > (y*x2) ) {return true;}
                if( (y*x1) < (y1*x) && (y2*x) < (y*x2) ) {return true;}
                
                x1 = c+l;
                y1 = d+l;
                x2 = c-l;
                y2 = d-l;
                if (y1*x > x1*y && y*x2 > x*y2) return true;
                if (y1*x < x1*y && y*x2 < x*y2) return true;
                
            }
        }
        }
        return false;
    }
    public static void main(String[] args) {
        in= new InputReader(System.in);
        out= new PrintWriter(System.out,true);
        a=in.nextInt();
        b=in.nextInt();
        c=in.nextInt();
        d=in.nextInt();
        double low=0.00;
        double high= 1e9;
        double m=0;
        if( a*d- b*c ==0){
            out.println(0);
        }else{
        for(int c=0; c<200; c++){
            m=(low+high)/2;
            if(isGood(m)){
                high=m;
            }else{
                low=m;
            }
        }
        out.println(high);
        }
        out.close();
        System.exit(0);
        
    }
    
    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public InputReader(InputStream stream) {
          reader = new BufferedReader(new InputStreamReader(stream), 32768);
          tokenizer = null;
        }

        public String next() {
          while (tokenizer == null || !tokenizer.hasMoreTokens()) {
            try {
              tokenizer = new StringTokenizer(reader.readLine());
            } catch (IOException e) {
              throw new RuntimeException(e);
            }
          }
          return tokenizer.nextToken();
        }

        public int nextInt() {
          return Integer.parseInt(next());
        }
        
        public long nextLong() {
              return Long.parseLong(next());
        }
 }
}