public class Euler744 {
    static double fExactSmall(long n, double p) {
        double q = 1.0 - p;
        double tv = Math.pow(q, (double) n);
        double te = Math.pow(p, (double) n);

        double total = 0.0;
        for (long m = 0; m < n; ++m) {
            double weight = (double) (n + 1L - m);
            total += weight * (tv + te);

            double mult = (double) (n + m) / (double) (m + 1L);
            tv *= mult * p;
            te *= mult * q;
        }

        return total / (double) (2L * n + 1L);
    }

    static double fLargeDrift(long n, double p) {
        double q = 1.0 - p;
        double dominant = (p > q) ? p : q;

        double twoNPlusOne = (double) (2L * n + 1L);
        double expectedQuestions = (double) n / dominant;
        return (twoNPlusOne - expectedQuestions) / twoNPlusOne;
    }

    static double f(long n, double p) {
        double q = 1.0 - p;
        double driftScore = Math.abs(1.0 - 2.0 * p) * Math.sqrt((double) n / (p * q));

        if (n <= 2000L || driftScore < 15.0) {
            return fExactSmall(n, p);
        }
        return fLargeDrift(n, p);
    }

    public static String solve() {
        double ans = f(100000000000L, 0.4999);
        return String.format(java.util.Locale.US, "%.10f", ans);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
