from math import ceil

import numpy as np

N,K=list(map(int, input().split()))

#サイコロを振る　１以上K未満→コイン　K以上ゲーム終了、す抜けのかち

#コイン　表なら２倍　裏なら０　０なったら負け

ans=max( (N-K+1),0) /N



#(K-1)/N

# M*(2**x)>=K M:サイコロの目

# x*log(2)>=log(K/M)

lim=min(K-1,N)

for i in range(1,lim+1):

    x=ceil(np.log(K/i)/np.log(2))

    ans+=(1/N)*((0.5)**x)

print(ans)
from math import ceil, log

N,K=list(map(int, input().split()))



ans=0

for i in range(1,N+1):

    n=ceil(log(K/i, 2))

    if n>=0:

        ans+=(1/(N*2**n))

    else:

        ans+=1/N

    #print(n)

print(ans)
from math import ceil
import numpy as np

N, K = list(map(int, input().split()))
# サイコロを振る　１以上K未満→コイン　K以上ゲーム終了、す抜けのかち
# コイン　表なら２倍　裏なら０　０なったら負け
ans = max((N - K + 1), 0) / N
# (K-1)/N
# M*(2**x)>=K M:サイコロの目
# x*log(2)>=log(K/M)
lim = min(K - 1, N)
for i in range(1, lim + 1):
    x = ceil(np.log(K / i) / np.log(2))
    ans += (1 / N) * ((0.5) ** x)
print(ans)

from math import ceil, log

N, K = list(map(int, input().split()))
ans = 0
for i in range(1, N + 1):
    n = ceil(log(K / i, 2))
    if n >= 0:
        ans += 1 / (N * 2**n)
    else:
        ans += 1 / N
    # print(n)
print(ans)

-from math import ceil -import numpy as np +from math import ceil, log -# サイコロを振る　１以上K未満→コイン　K以上ゲーム終了、す抜けのかち -# コイン　表なら２倍　裏なら０　０なったら負け -ans = max((N - K + 1), 0) / N -# (K-1)/N -# M*(2**x)>=K M:サイコロの目 -# x*log(2)>=log(K/M) -lim = min(K - 1, N) -for i in range(1, lim + 1): -    x = ceil(np.log(K / i) / np.log(2)) -    ans += (1 / N) * ((0.5) ** x) +ans = 0 +for i in range(1, N + 1): +    n = ceil(log(K / i, 2)) +    if n >= 0: +        ans += 1 / (N * 2**n) +    else: +        ans += 1 / N +    # print(n)