Experimental computation of:

Log2[n!]≈(n+(1/2)) Log2[n]-1.44n +1.33

More exactly,

Log2[n!]=(∑_(i=1)^n)Log2[i] ≈ n Log2[n]-(1/(Log[2]))n +((Log2[n])/2)+((Log[2 π])/(Log[4]))+1/(Log[4096]n)-1/(360 Log[2](n^3))± o((1/(n^3)))

Plot[{n Log2[n]-Log2[E]n +((Log2[n])/2)+(1/2)Log2[ 2π]+((Log2[E])/(12n))-1/(360 Log[2](n^3)),(∑_(i=1)^n)Log2[i]},{n,1,50},PlotPoints-> 100]

Perfect match!

Here is a test of the above approximation for computing the exact value of  ⌈Log2[n!]⌉

Plot[Tooltip[{⌈n Log2[n]-Log2[E]n +(1/2)Log2[n]+(1/2)Log2[ 2π]+Log2[E]/(12n)-1/(360 Log[2](n^3))⌉,⌈(∑_(i=1)^n)Log2[i]⌉}],{n,1,20},PlotPoints-> 200]

It works up to fairly large values of n. 

(*ProjectExercise: Write a program that searches for n that makes the approximation not equal to ⌈Log2[n!]⌉ and let me know such n if  your program found it*)

A more practical lower bound on ⌈Log2[n!]⌉ that uses 

(∑_(i=1)^n)Log2[i] ≈ 
(n+(1/2)) Log2[n]-1.4426950408889634`n +1.3257480647361592`+(0.12022458674074696`/n)-(0.004007486224691565`/(n^3))
:

Plot[Tooltip[{⌈(n+(1/2)) Log2[n]-1.4426950408889634n +1.3257480647361592⌉,⌈(∑_(i=1)^n)Log2[i]⌉}],{n,1,20},PlotPoints-> 200]

Testing the difference between the two - if it is 0 or less then the "approximate" lower bound is correct.

DiscretePlot[{⌈(n+(1/2)) Log2[n]-1.4426950408889634n +1.3257480647361592⌉-⌈(∑_(i=1)^n)Log2[i]⌉},{n,1,100}]

Using our most exact approximation of Log2[n!], one can show that for n>100,
(n+(1/2)) Log2[n]-1.4426950408889634n +1.3257480647361592 < (∑_(i=1)^n)Log2[i]

This yields a slightly lesser but simpler lower bound of (∑_(i=1)^n)Log2[i]

So, our simpler lower bound
⌈(n+(1/2)) Log2[n]-1.4426950408889634n +1.3257480647361592⌉
of ⌈Log2[n!]⌉ is a correct lower bound for all n.

However,this simpler lower bound slightly underestimates ⌈Log2[n!]⌉. 

So,although it is a valid lower bound of ⌈Log2[n!]⌉, it is not always equal to ⌈Log2[n!]⌉.

⌈(n+(1/2)) Log2[n]-1.443n +1.325⌉

DiscretePlot[{⌈(n+(1/2)) Log2[n]-1.443n +1.325⌉-⌈(∑_(i=1)^n)Log2[i]⌉},{n,1,100}]

Here is a test of the textbook approximation

DiscretePlot[{⌈(n+(1/2)) Log2[n]-1.443n⌉-⌈(∑_(i=1)^n)Log2[i]⌉},{n,1,100}]

Not nearly as good as ours!

(∑_(i=1)^n)Log2[i] ≈ 
n Log2[n]-Log2[E]n +(1/2)Log2[n]+(1/2)Log2[ 2π]+Log2[E]/(12n)-1/(360 Log[2](n^3))

and the difference between this and the exact value is in   o((1/(n^3))).

Sterling formula (see file Mathematica/Stirling_formula.nb) would yield this:
(∑_(i=1)^n)Log2[i] = Log2[n!] >Log2[((((n/E)))^n)(Sqrt[2π n])]>(n+(1/2))Log2[n]-(n/(Log[2]))+(1/2)Log2[2 π]≈
(n+(1/2))Log2[n]-1.4426950408889634`n+1.3257480647361592`>
(n+(1/2))Log2[n]-1.443n+1.325

and

(∑_(i=1)^n)Log2[i] = Log2[n!] <Log2[((((n/E)))^n)(Sqrt[2π n])(1 + (1/(11n)))]<(n+(1/2))Log2[n]-(n/(Log[2]))+(1/2)Log2[2 π]+Log2[1 + (1/(11n))]≈
(n+(1/2))Log2[n]-1.4426950408889634`n+1.3257480647361592`+Log2[1 + (1/(11n))]<
(n+(1/2))Log2[n]-1.442n+1.326

So, again,

(∑_(i=1)^n)Log2[i] ≈ (n+(1/2))Log2[n]-1.443n+1.326

Either experimental or Stirling formula method is OK for derivation of (∑_(i=1)^n)Log2[i] ≈ (n+(1/2))Log2[n]-1.443n+1.326

All computations below are optional for all students.




Simplifications:

(1/(Log[2]))= Log2[E]
((Log2[n])/2)= same
((Log[2 π])/(Log[4]))=(Log[2]+Log[ π])/(2Log[2])=(1/2)(1+Log2[ π])
(1/(Log[4096]))=(1/(12Log[2]))=((Log2[E])/12)

Ckeck:

N[(1/(Log[2]))]

N[Log2[E]]

N[((Log[2 π])/(Log[4]))]

N[((1+Log2[ π])/2)]

N[((Log2[ 2π])/2)]

N[(1/(Log[4096]))]

N[((Log2[E])/12)]

N[(1/(360 Log[2]))]

OK

(∑_(i=1)^n)Log2[i] ≈ 
n Log2[n]-1.4426950408889634`n +((Log2[n])/2)+1.3257480647361592`+0.12022458674074696`/n-0.004007486224691565`/(n^3)

Plot[n Log2[n]-Log2[E]n +((Log2[n])/2)+((Log2[ 2π])/2)+((Log2[E])/(12n))-1/(360 Log[2](n^3)),{n,1,200}]

Plot[{n Log2[n]-Log2[E]n +((Log2[n])/2)+(1/2)Log2[ 2π]+((Log2[E])/(12n))-1/(360 Log[2](n^3)),(∑_(i=1)^n)Log2[i]},{n,1,20}]

DiscretePlot[{(∑_(i=1)^n)Log2[i]-(n Log2[n]-Log2[E]n +(1/2)Log2[n]+(1/2)Log2[ 2π]+Log2[E]/(12n)-1/(360 Log[2](n^3))),(1/(n^3))},{n,1,200}]

Here is the computation of the above result:

Limit[{((∑_(i=1)^n)Log2[i])/(n Log2[n])},n->∞]

Plot[Tooltip[{(∑_(i=1)^n)Log2[i],n Log2[n]}],{n,1,20}]

Limit[{((∑_(i=1)^n)Log2[i])-(n Log2[n])},n->∞]

Plot[Tooltip[{((∑_(i=1)^n)Log2[i])-(n Log2[n]),-1.443n}],{n,1,20}]

Limit[{(((∑_(i=1)^n)Log2[i])-(n Log2[n]))/n},n->∞]

Limit[{(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n))},n->∞]

Plot[Tooltip[{(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n)),Log2[n]}],{n,1,200}]

Limit[{(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n))/Log2[n]},n->∞]

Limit[{(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n))/(((Log2[n])/2))},n->∞]

Limit[{(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]))},n->∞]

Limit[{n(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]))},n->∞]

Limit[{n(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]+1/(Log[4096]n)))},n->∞]

Limit[{(n^2)(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]+1/(Log[4096]n)))},n->∞]

Limit[{(n^3)(((∑_(i=1)^n)Log2[i])-((n Log2[n])-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]+1/(Log[4096]n)))},n->∞]

Limit[{(n^3)(((∑_(i=1)^n)Log2[i])-(n Log2[n]-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]+1/(Log[4096]n)-1/(360 Log[2](n^3))))},n->∞]

DiscretePlot[{(((∑_(i=1)^n)Log2[i])-(n Log2[n]-(1/Log[2])n +(1/2)Log2[n]+Log[2 π]/Log[4]+1/(Log[4096]n)-1/(360 Log[2](n^3))))},{n,1000,1200}]