#include <stdio.h>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;

#define EPS (1e-10)
#define EQ(a,b) (abs((a) - (b)) < EPS)
#define EQV(a,b) (EQ((a).real(),(b).real()) && EQ((a).imag(),(b).imag()))

typedef complex<double> P;
typedef long long ll;

// àÏ
double dot(P a, P b) {
  return (a.real() * b.real() + a.imag() * b.imag());
}
// OÏ
double cross(P a, P b) {
  return (a.real() * b.imag() - a.imag() * b.real());
}
// a1,a2ðÊé¼üÆb1,b2ðÊé¼üÌð_vZ
P intersection_l(P a1, P a2, P b1, P b2) {
  P a = a2 - a1; P b = b2 - b1;
  return a1 + a * cross(b, b1-a1) / cross(b, a);
}

// ½p`ÌÊÏö®
double calcPolygonArea(vector<P> p){
  double sum=0;
  for(int i = 0; i < p.size(); i++)
    sum+=cross(p[i],p[(i+1)%(p.size())]);
  return sum/2;
}

int main(){

  int n;
  while(cin>>n&&n!=0){
    // es²ÆÉÀWði[
    vector<P> points[50];
    vector<P> a,b,c,d;
    for(int i = 0; i < n; i++){
      double t;
      cin>>t;
      a.push_back(P(t,0));
    }
    for(int i = 0; i < n; i++){
      double t;
      cin>>t;
      b.push_back(P(t,1));
    }
    for(int i = 0; i < n; i++){
      double t;
      cin>>t;
      c.push_back(P(0,t));
    }
    for(int i = 0; i < n; i++){
      double t;
      cin>>t;
      d.push_back(P(1,t));
    }
    // s²ÆÉi[
    for(int i = 0; i <= n+1; i++){
      if(i==0){
	points[i].push_back(P(0,0));
	for(int j = 0; j < a.size(); j++){
	  points[i].push_back(a[j]);
	}
	points[i].push_back(P(1,0));
      }
      else if(i==n+1){
	points[i].push_back(P(0,1));
	for(int j = 0; j < b.size(); j++){
	  points[i].push_back(b[j]);
	}
	points[i].push_back(P(1,1));
      }
      else{
	points[i].push_back(c[i-1]);
	for(int j = 0; j < a.size(); j++){
	  // ð_ðvZ
	  P crossPoint=intersection_l(c[i-1],d[i-1],a[j],b[j]);
	  points[i].push_back(crossPoint);
	}
	points[i].push_back(d[i-1]);
      }
    }
    double maxRec=-1;
    // elp`ÌÊÏðvZ
    for(int i = 1; i <= n+1; i++){
      for(int j = 1; j <= n+1; j++){
	vector<P> ps;
	ps.push_back(points[i][j-1]);
	ps.push_back(points[i][j]);
	ps.push_back(points[i-1][j]);
	ps.push_back(points[i-1][j-1]);
	maxRec=max(maxRec,abs(calcPolygonArea(ps)));
      }
    }
    printf("%.6f\n",maxRec);
    //cout<<maxRec<<endl;
  }
    
  return 0;
}