数式で独楽する

数式を使って楽しむブログです

[tex: ]

対数計算のアルゴリズム lb 10

本稿では、対数を計算する手法を見ていきます。


toy1972.hatenablog.com

では、以下の2つの式を駆使すれば、計算していくことができることを述べました。
\begin{eqnarray}
(1) && \ \log_a x &=& \frac{1}{2} \log_a x^2 \\
(2) && \ \log_a x &=& 1+ \log_a \frac{x}{a}
\end{eqnarray}

具体例を見ていきます。次は \mathrm{lb} \ 10です。
謎の「lb」は二進対数といい、底が2の対数です。
\begin{equation}
\mathrm{lb} \ x = \log_2 x
\end{equation}ということです。
ですが、 \TeXでlbを直立で書くのは面倒なので、以下、 \log_2 xで書くことにします。
例に \log_2 10を選んだのは、
\begin{equation}
\log_2 10=\frac{1}{\log_{10} 2}
\end{equation}だからです。*1 *2

上記の(1)と(2)は、次のようになります。
\begin{eqnarray}
(1) && \ \log_2 x &=& \frac{1}{2} \log_2 x^2 \\
(2) && \ \log_2 x &=& 1+ \log_2 \frac{x}{2}
\end{eqnarray}
2進数で表記すると、
\begin{equation}
\frac{1}{2}=0.1
\end{equation}で、 x/2は小数点が1桁左に移動します。
10進数の10は、2進数では1010です。
\begin{equation}
10=2^3 \times \frac{10}{2^3}
\end{equation}なので、2進数で表すと、
\begin{equation}
1010=10^{11} \times 1.01
\end{equation}です。

\begin{eqnarray}
1.01^2 &=& 1.1001\\
1.1001^2 &=& 10.01110001 \\
1.00111^2 &=& 1.0111110001
\end{eqnarray}
2乗すると、すぐに桁が長くなります。
3行目では小さい桁を省略しました。

では、計算していきます。ここから2進数表記です。
途中から端折ります。
\begin{eqnarray}
\log_2 1010 &=& 11 + \log_2 1.01 \\
&=& 11 + 0.1 \log_2 1.1001 \\
&=& 11 + 0.01 \log_2 10.01110001 \\
&=& 11.01 (1 + \log_2 1.001110001) \\
&=& 11.01 (1 + 0.1 \log_2 1.011111 \cdots) \\
&=& 11.01 (1 + 0.01 \log 10.0011 \cdots) \\
&=& 11.0101 (1 + \log_2 1.00011 \cdots) \\
&=& 11.0101001 (1 + \log_2 1. \cdots ) \\
&=& 11.0101001001 (1 + \log_2 1. \cdots) \\
&=& 11.01010010011 (1 + \log_2 1. \cdots) \\
&=& 11.0101001001101 (1 + \log_2 1. \cdots) \\
&=& 11.0101001001101001 (1 + \log_2 1. \cdots)
\end{eqnarray}
2進数だと表記は0か1です。
途中で計算を打ち切っても、誤差は打ち切った桁の大きさにはなりません。
余りの部分は、必ず
\begin{equation}
\log_2 1. \cdots < 1
\end{equation}です。
2進数表記はここまでです。

本稿の場合、 2^{-16}の位まで計算しているので、誤差は 2^{-16}未満です。

10進数に直すと、
\begin{equation}
11.0101001001101001_{(2)} = 3.321914672 \cdots
\end{equation}です。
一方、
\begin{equation}
\log_2 10 = 3.321928094 \cdots
\end{equation}です。
ここまでやって、やっと小数第4位までが一致します。

*1:\begin{equation} a^x=b \Longleftrightarrow x = \log_a b \end{equation}より \begin{equation} a=b^{1/x} \Longleftrightarrow \frac{1}{x} = \log_b a \end{equation}が得られます。したがって、 \begin{equation} \log_a b = \frac{1}{\log_b a} \end{equation}となります。

*2:一方、 \begin{equation} \log_a x = \frac{\log_b a}{\log_b x} \end{equation}で b=xとすると、 \begin{equation} \log_a b = \frac{1}{\log_b a} \end{equation}となります。