#include <bits/stdc++.h>
using namespace std;
double EPS = 1e-9;
int INF = 2000000000;
long long INFF = 8000000000000000000LL;
double PI = acos(-1);
int dirx[8] = {-1, 0, 0, 1, -1, -1, 1, 1};
int diry[8] = {0, 1, -1, 0, -1, 1, -1, 1};
inline string IntToString(int a) {
  char x[100];
  sprintf(x, "%d", a);
  string s = x;
  return s;
}
inline int StringToInt(string a) {
  char x[100];
  int res;
  strcpy(x, a.c_str());
  sscanf(x, "%d", &res);
  return res;
}
inline string GetString(void) {
  char x[1000005];
  scanf("%s", x);
  string s = x;
  return s;
}
inline string uppercase(string s) {
  int n = (int)s.size();
  for (int(i) = (0); (i) < (n); ++(i))
    if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - 'a' + 'A';
  return s;
}
inline string lowercase(string s) {
  int n = (int)s.size();
  for (int(i) = (0); (i) < (n); ++(i))
    if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
  return s;
}
inline void OPEN(string s) {
  freopen((s + ".in").c_str(), "r", stdin);
  freopen((s + ".out").c_str(), "w", stdout);
}
double prob[10005];
int n;
pair<int, int> data[6];
int main() {
  scanf("%d", &n);
  for (int(i) = (0); (i) < (n); ++(i))
    scanf("%d %d", &data[i].first, &data[i].second);
  double risan = 0;
  for (int(i) = (0); (i) < (n); ++(i)) {
    swap(data[i], data[n - 1]);
    int m = n - 1;
    for (int(j) = (1); (j) <= (10000); ++(j)) {
      prob[j] = 0;
      for (int(bit) = (0); (bit) < (1 << m); ++(bit))
        if (bit > 0) {
          double res = 1;
          for (int(k) = (0); (k) < (m); ++(k))
            if (bit & (1 << k)) {
              if (data[k].first <= j && j <= data[k].second) {
                res *= 1.0 / (double)(data[k].second - data[k].first + 1);
              } else
                goto hell;
            } else {
              if (data[k].first >= j) goto hell;
              int batas = min(data[k].second, j - 1);
              res *= (double)(batas - data[k].first + 1) /
                     (double)(data[k].second - data[k].first + 1);
            }
          prob[j] += res;
        hell:;
        }
    }
    for (int(j) = (1); (j) <= (10000); ++(j))
      prob[j] = prob[j] * j + prob[j - 1];
    swap(data[i], data[n - 1]);
    for (int(j) = (data[i].first); (j) <= (data[i].second); ++(j)) {
      risan += 1.0 / (double)(data[i].second - data[i].first + 1) * prob[j - 1];
    }
  }
  for (int(j) = (1); (j) <= (10000); ++(j)) {
    for (int(bit) = (0); (bit) < (1 << n); ++(bit))
      if (__builtin_popcount(bit) > 1) {
        double res = j;
        for (int(i) = (0); (i) < (n); ++(i))
          if (bit & (1 << i)) {
            if (data[i].first <= j && j <= data[i].second) {
              res *= 1.0 / (double)(data[i].second - data[i].first + 1);
            } else
              goto hell2;
          } else {
            if (data[i].first >= j) goto hell2;
            int batas = min(data[i].second, j - 1);
            res *= (double)(batas - data[i].first + 1) /
                   (double)(data[i].second - data[i].first + 1);
          }
        risan += res;
      hell2:;
      }
  }
  printf("%.10lf\n", risan);
  return 0;
}
