Exp low prec

top Top: 17 lines / syttrea

par Par: 45 lines

Problem Statement

LM0上の Float 配列 \(X\) の各要素 \(X[i]\) について、指数関数 \(Y[i] = \exp(X[i])\) を計算し、LM1上に出力してください。

Explanation

指数関数 \(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, …のように定数にすることができます。

以下は、即値用の階乗の逆数です。

1.00000000000000000 # 1/1! 0.50000000000000000 # 1/2! 0.16666666666666666 # 1/3! 0.04166666666666666 # 1/4! 0.00833333333333333 # 1/5! 0.00138888888888889 # 1/6! 0.00019841269841270 # 1/7! 0.00002480158730159 # 1/8! 0.00000275573192240 # 1/9! 0.00000027557319224 # 1/10!

Tips: ホーナー法:マクローリン展開をより高速・高精度に計算する手法

今回の問題では必須ではありませんが、マクローリン展開の計算をより高精度に行うための手法としてホーナー法があります。

通常のマクローリン展開では、以下のように各項を順番に計算していきます

\(\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!})))\)

必要な乗算回数が減り計算が高速化されるだけでなく、計算の過程で大きな数と小さな数を足し合わせる機会も減るため、コンピュータの計算で生じやすい桁落ち誤差を抑制し、より正確な計算結果を得やすくなります。

Inputs

Outputs

Testcases

testcase.vsm

Submission

ログイン / 新規登録