#include <bits/stdc++.h>
using namespace std;
bool comp(int a, int b) { return a > b; }
int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
bool isPrime(int n) {
  if (n <= 1) return false;
  if (n <= 3) return true;
  if (n % 2 == 0 || n % 3 == 0) return false;
  for (int i = 5; i * i <= n; i = i + 6) {
    if (n % i == 0 || n % (i + 2) == 0) {
      return false;
    }
  }
  return true;
}
void primeFactors(int n) {
  while (n % 2 == 0) {
    cout << 2 << " ";
    n = n / 2;
  }
  for (int i = 3; i <= sqrt(n); i = i + 2) {
    while (n % i == 0) {
      cout << i << " ";
      n = n / i;
    }
  }
  if (n > 2) {
    cout << n << " ";
  }
}
int dayofweek(int d, int m, int y) {
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  return (y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7;
}
void BellmanFord(int graph[][3], int V, int E, int src) {
  int dis[V];
  for (int i = 0; i < V; i++) dis[i] = INT_MAX;
  dis[src] = 0;
  for (int i = 0; i < V - 1; i++) {
    for (int j = 0; j < E; j++) {
      if (dis[graph[j][0]] + graph[j][2] < dis[graph[j][1]])
        dis[graph[j][1]] = dis[graph[j][0]] + graph[j][2];
    }
  }
  bool flag = true;
  for (int i = 0; i < E; i++) {
    int x = graph[i][0], y = graph[i][1], weight = graph[i][2];
    if (dis[x] != INT_MAX && dis[x] + weight < dis[y]) {
      flag = false;
      break;
    }
  }
}
void topoSort(int n, int m, vector<vector<bool>> &e, vector<bool> &visited,
              int x) {
  visited[x] = true;
  for (int i = n - 1; i >= 0; i--) {
    if (e[x][i] and !visited[i]) {
      topoSort(n, m, e, visited, i);
    }
  }
  return;
}
void convertGraphToTree(int x, vector<vector<int>> &v, vector<bool> &visited,
                        vector<vector<int>> &newedges) {
  visited[x] = true;
  for (int i = 0; i < v[x].size(); i++) {
    if (!visited[v[x][i]]) {
      newedges[x].push_back(v[x][i]);
      convertGraphToTree(v[x][i], v, visited, newedges);
    }
  }
  return;
}
int subtreeCount(int x, vector<vector<int>> &v, vector<bool> &visited,
                 vector<int> &count) {
  visited[x] = true;
  int ans = 1;
  for (int i = 0; i < v[x].size(); i++) {
    if (!visited[v[x][i]]) {
      ans += subtreeCount(v[x][i], v, visited, count);
    }
  }
  count[x] = ans;
  return ans;
}
void helper(int n) {
  double ans = 0.0;
  for (int i = n; i >= 1; i--) {
    double temp = 1.0 / double(i);
    ans += temp;
  }
  cout << ans << endl;
  return;
}
int main() {
  int n;
  cin >> n;
  helper(n);
  return 0;
}
