二進対数
小数点以下の切り上げ・切り捨てを行って、整数→整数の二進対数を定めることができる。これら二つ(切り上げ・切り下げ)の整数二進対数の間には、
⌊ log 2  n ⌋ = ⌈ log 2  ( n + 1 ) ⌉ − 1 {\displaystyle \lfloor \log _{2}n\rfloor =\lceil \log _{2}(n+1)\rceil -1} ただし、1 ≦ n
の関係がある。この左辺の関数は、 ⌊ log 2  0 ⌋ = − 1 {\displaystyle \lfloor \log _{2}0\rfloor =-1} とおくことによって、定義域を n ≧ 0 にまで拡張できる。このように拡張した関数は、非負整数 n の m ビット符号なし二進表示における先頭の0の個数(英語版) nlz(n) との間で
⌊ log 2  n ⌋ = ( m − 1 ) − nlz  ( n ) {\displaystyle \lfloor \log _{2}n\rfloor =(m-1)-\operatorname {nlz} (n)}
の関係にある。この整数二進対数は、n の最上位ビットがどこにあるかを示している。
)
例として、1.65の二進対数を4ビットの精度で計算する(すなわち、上記の関数を lb(1.65, 4) として呼び出す)ケースを考える。このプログラムを逐次追いかけていくと次のようになる。
まず、このプログラムでは整数位の計算が既に終わっていることを前提とする(すなわち、1 ≦ y < 2 となっていることを要求する)ので、無条件で "0." の2文字を書く。
与えられた y = 1.65 を2乗すると2.72となる。これは2以上なので、小数1桁目として1を書く。この2.72を2で割って1.36を得る。
1.36を2乗すると1.85となる。これは2より小さいので、2で割ることはせず、2桁目として0を書く。
1.85を再度2乗すると3.43となる。これは2以上なので、3桁目として1を書く。この3.43を2で割って1.72を得る。
1.72を2乗すると2.95となる。これは2以上なので、4桁目として1を書く。ほしい精度は4ビットなので、これで計算終了とする。
こうして0.1011という数字列を得たので、
lb 1.65 ≒ 0.1011(2) = 13/16
と確定させる。このとき、誤差は1/16未満となっている。さらにもう1ビット計算すれば27/32となり、誤差は1/32未満となる。一般に、m ビットの精度がほしい(すなわち、誤差を (1/2) 未満としたい)ときには、2乗の計算をちょうど m 回、2で割る計算を最大 m 回行えば必要十分である。