/*
　　　　　　　　　　　　 ．∨:::::／.　　　／' 　 /　 .／　　　　 ヽ::..　 :.､　　　 ＼
　　　　　　　　 　 　 　 ： |:／ /　　　/　　　/　 .,'　 .:.　　　 .:. ﾄ､::..　 ｉ　　　.:.　:.
　　　　　　　　　　　　　．.′:/　 　 .:′　.::/　.:/| .::/::　　 .:/:: |　V::.. |::.　　.::ｉ:.
　　　　　 　 　 　 　 　 ； |　.' ::. 　 .:l　　.::,'ｉ :､,'　|.:::ｉ::. 　 .::ハ::.l　 |;:::,ハ:: 　 ::|:::.
　　　　　　　　 　 　 　 ．|　ｉ ::.. 　 ::|:　.::/ | :/＼|.::ﾊ:::.　..::|　|::l／|::/　 |::　 .::l:::::
.　　　　　　 　 　 　 　 ： |　| :|:::.　 ::|:.　:ﾄ‐|/=≧lﾒ､ V::.:.:::|,vｊ厶=ｊ/-‐ｧl::　.::,'::::
.　　　　　　 　 　 　 　 ； |　l.::|:ヽ::.:八::.::|｀　ん.)::ﾊ`゛∨:::::l 'ｲん.)::ﾊ /,.':: :::/::::
.　　　　　　　 　 　 　 ． ｊﾉ ヽ| : ::＼:::ヽ:ゝ 弋:zｨ:ｿ　　｀ヽ:|　 ､::zｨ:ｿ /:::::::/:::::'
　 　 　 　 　 　 　 ．　／　　:ｉ　: : : ::ﾄ､::_::.＼////　 　 '　　 ////.∠.:::イ:::,:′ /:
　　　　　　　　　 ； ／　　.,'.:∧　 ｀ヽゝ.._ﾊ￣: : : :.　　　 　 　 　 : : : :. /ﾉ::'　　/::
.　　　　　　　 ． ／　　 .::　 .::::ヽ.　 　 ＼人　　　r ───‐ '｀ヽ　 ,.:':´:/　　,':::::
.　　　　　　 ． ,:' 　 　 .:/:...:::::::::::::ゝ..　　 ｀ヽ＞:.._ゝ~-‐　 -‐＜ソィ´::／　　.ﾉ:::::::
　　　 　 　 ； 〈　　 　 ::{::::::／/´　　 ｀ヽ.....,.‐v'⌒l＞‐-‐　 ,ｨ⌒ｖ-､:'´ 　 ／￣ ｀ヽ
.　　 　 　 　 ： ＼　　 ::.ヽ/::::l　　　　 :Ｙ:::/　,'⌒⌒'ヽ....,ｨ^⌒⌒'　ハ ,.ィ/
.　　　　 　 　 ；　 ＼　 :::::｀ヽ|　 　 　 ::l::〈　/..../.../... }::{　 ｉ.....}.....ｊ... ﾉ':::/::. 　 ＿..
　　　　　　　　　　　(.￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
.　　　　　 　 　 　 　 〉 ￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣
　　　　　　　　　 　 ,'
　 　 　 　 　 　 　 /
*/
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>

using namespace std;
using ll = long long;
using ull = unsigned long long;

#ifndef __MACRO_H__
#define __MACRO_H__

#define all(collection)  (collection).begin(), (collection).end()		// begin to end
#define rep(i, begin, end) for (ll i = begin; i < end; i++)					// repeat
#define repr(i, begin, end) for (ll i = begin - 1; end <= i; i--)		// repeat reverse

std::chrono::system_clock::time_point  start;

void TimeStart(void)
{
	start = std::chrono::system_clock::now();
}

void TimeEnd(void)
{
	auto time = std::chrono::system_clock::now() - start;
	auto msec = std::chrono::duration_cast<std::chrono::milliseconds>(time).count();
	cerr << endl << msec << " msec " << endl;
}

#endif


double kakuritu(ll n, ll k)
{
	ll pow = n;
	double ans = 1;

	while (1)
	{
		if (k <= pow)
			break;

		ans /= 2;
		pow *= 2;
	}

	return ans;
}


int main(void)
{
	ll n; cin >> n;
	ll k; cin >> k;

	double ans = 0.0;
	rep(i, 1, n + 1)
		ans += ((double)1.0 / (double)n) * kakuritu(i, k);

	printf("%.16f", ans);
	return 0;
}

Measured memory_bytes: 256