Top: 17 lines / syttrea
Par: 45 lines
LM0上の Float 配列 \(X\) の各要素 \(X[i]\) について、指数関数 \(Y[i] = \exp(X[i])\) を計算し、LM1上に出力してください。
指数関数 \(e^x\) は、マクローリン展開を用いて以下のように計算できることが知られています。
\(\exp(x) = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots\)
この展開を、2次(\(x^{2}/2!\))まで繰り返すことで 4096 個中 734 個が correct、7次(\(x^{7}/7!\))まで繰り返すことで Accept が得られることを確認しています。
マクローリン展開の分母 \(/n!\) で必要な除算が厄介と感じるかもしれませんが、ループアンロールを行うので、0.5, 0.1666, 0.04166, …のように定数にすることができます。
以下は、即値用の階乗の逆数です。
今回の問題では必須ではありませんが、マクローリン展開の計算をより高精度に行うための手法としてホーナー法があります。
通常のマクローリン展開では、以下のように各項を順番に計算していきます
\(\exp(x) = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + \cdots\)
しかし、ホーナー法では、以下のように小さい項からまとめて計算します
\(\exp(x) = 1 + x (\frac{1}{1!}+ x(\frac{1}{2!} + x (\frac{1}{3!} + \frac{x}{4!})))\)
必要な乗算回数が減り計算が高速化されるだけでなく、計算の過程で大きな数と小さな数を足し合わせる機会も減るため、コンピュータの計算で生じやすい桁落ち誤差を抑制し、より正確な計算結果を得やすくなります。
$lm[0:16], (256,16)/((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1); B@[MAB])
$ln[0:16], (256,16)/((8_L2B:1, 4:2, 8_L1B:1), (2:1, 4_PE:1, 2_W:1))
/ \(0.009\) 以下の絶対誤差が許容されます