#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:36777216")
using namespace std;
double sqr(double a) { return a * a; }
const long long int inf = 100000000000000000LL;
struct Node {
  vector<pair<int, int> > nbr;
  int used;
};
double getP(pair<int, int> a, int c) {
  if (a.first > c || a.second < c) {
    return 0;
  }
  return 1.0 / (a.second + 1 - a.first);
}
double getUp(pair<int, int> a, int c) {
  if (a.first > c) {
    return 1;
  }
  if (a.second < c) {
    return 0;
  }
  return 1.0 * (a.second - c) / (a.second - a.first + 1);
}
double getLow(pair<int, int> a, int c) {
  if (a.first >= c) {
    return 0;
  }
  if (a.second < c) {
    return 1;
  }
  return 1.0 * (c - a.first) / (a.second - a.first + 1);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout << fixed << setprecision(15);
  int n;
  cin >> n;
  vector<pair<int, int> > arr(n);
  int v = 0;
  for (int i = 0; i < n; ++i) {
    cin >> arr[i].first >> arr[i].second;
    v = max(v, arr[i].second);
  }
  double ans = 0;
  for (int c = 1; c <= v; ++c) {
    double a = 0;
    for (int i = 1; i < (1 << n); ++i) {
      double p = 1;
      vector<int> used(n);
      int col = 0;
      for (int j = 0; j < n; ++j) {
        if (i & (1 << j)) {
          used[j] = 1;
          ++col;
          p *= getP(arr[j], c);
        }
      }
      double w = 0;
      for (int j = 0; j < n; ++j) {
        if (used[j]) {
          continue;
        }
        double q = p;
        q *= getUp(arr[j], c);
        used[j] = 1;
        for (int k = 0; k < n; ++k) {
          if (used[k] == 0) {
            q *= getLow(arr[k], c);
          }
        }
        w += q;
        used[j] = 0;
      }
      a += w;
      if (col > 1) {
        double q = p;
        for (int k = 0; k < n; ++k) {
          if (used[k] == 0) {
            q *= getLow(arr[k], c);
          }
        }
        a += q;
      }
    }
    ans += a * c;
  }
  cout << ans;
  return 0;
}
