//zelovoc
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cstring>
#include<cmath>

using namespace std;
#define For(i,n) for(int i = 0; i<int(n); ++i)
#define INF 1023456789
#define linf 1023456789123456789LL

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<int> vint;
typedef pair<double, double> pdd;
typedef pair<double, int> pdi;
typedef pair<pdd, int> ppddi;
#define db(x) cerr << #x << " = " << x << endl

double predbehne(pdd a, pdd b)
{
	return (b.first - a.first)/(a.second - b.second);
}

vector<pdi > leader(vector<ppddi > cheetah, double t)
{
	int n = cheetah.size();
	sort(cheetah.begin(), cheetah.end());
	vint alive(n, 1), pred(n);
	pdi best(-linf, -1);
	priority_queue<pdi, vector<pdi >, greater<pdi > > event;
	for(int i=n-1; i>=0; i--)
	{
		if(pdi(cheetah[i].first.second, i) > best)
		{
			pred[i] = best.second;
			best = pdi(cheetah[i].first.second, i);
			if(pred[i] != -1)
			{
				event.push(pdi(t + predbehne(cheetah[i].first, cheetah[pred[i]].first), i));
			}
		}
		else alive[i] = 0;
	}
	vector<pdi > res(1, pdi(t, cheetah.back().second));
	while(!event.empty())
	{
		pdi tp = event.top();
		event.pop();
		int cur = tp.second;
		if(!alive[cur])continue;
		int on = pred[cur];
		pred[cur] = pred[on];
		alive[on] = 0;
		if(pred[cur] != -1)event.push(pdi (t + predbehne(cheetah[cur].first, cheetah[pred[cur]].first) ,cur));
		else res.push_back(pdi(tp.first, cheetah[cur].second));
	}
	return res;
}

int main() 
{
	int n;
	while(scanf("%d",&n))
	{
		if(n == 0)break;
		vector<int> t(n), v(n);
		int maxt = -INF;
		for(int i=0; i<n; i++)
		{
			scanf("%d %d",&t[i], &v[i]);
			maxt = max(maxt, t[i]);
		}
		
		vector<ppddi > gepard(n);
		for(int i=0; i<n; i++)
		{
			gepard[i] = ppddi(pdd((double)(maxt - t[i]) * v[i],v[i]), i);
		}
		
		vector<pdi > prvy = leader(gepard, maxt);
		for(int i=0; i<n; i++)
		{
			gepard[i].first.first *= -1;
			gepard[i].first.second *= -1;
		}
		vector<pdi > posledny = leader(gepard, maxt);
		prvy.push_back(pdi(linf, -1));
		posledny.push_back(pdi(linf, -1));
		int pri = 0, posi = 0;
		int prid = prvy[0].second, posid = posledny[0].second;
		double res = linf;
		for(int i=0; i<prvy.size() + posledny.size() - 2; i++)
		{
			double teraz;
			if(prvy[pri].first < posledny[posi].first)
			{
				prid = prvy[pri].second;
				teraz = prvy[pri].first;
				pri++;
			}
			else
			{
				posid = posledny[posi].second;
				teraz = posledny[posi].first;
				posi++;
			}
			res = min(res, (teraz - t[prid])*v[prid] - (teraz - t[posid])*v[posid]);
		}
		printf("%.5lf\n",res);
	}
	return 0;
}