7

数値を分数で累乗する必要があるアプリケーションがあります。ターゲット プラットフォームは FPGA であり、その FPU サイズを見積もることはできますが、実現可能性調査のためだけに数値を分数で累乗するアルゴリズムが必要です。最悪のケースとして浮動小数点を想定しています。実際にはショートカットを使用できると思いますが、今のところ、最悪のケースを実装できることを示したいと思います。

ここで質問して、チェックアウトできる一般的な方法があるかどうかを確認したいと思いました。これを行うソフトウェアの方法があることは知っていますが、最初はかなり効率的なアルゴリズムが必要です。FPGAの実装について心配します。

4

2 に答える 2

8

入力の範囲は任意ですか、それとも特定の範囲内でわかっていますか?

いずれの場合も、x m = exp(m log x)であるため、exp(x)とlog(x)を評価する関数を作成し、乗算を行うことができれば、おそらくすべて設定されています。

xの正でない値をどのように処理するかを理解する必要があります。

(log(x)のヒント:これがIEEE-754浮動小数点の場合、ある値Kに対して2kから2k + 1の範囲の数値になるまで、必要に応じて仮数をシフトします。これにより、多項式で近似するのはそれほど難しくない2:1の範囲です。そうすると、指数とシフト数を処理する可能性がわずかになります。

exp(x)に対応するヒント:x = k + bと記述します。ここで、0 <= b <1であり、kは整数です。次に、exp(x)= exp(k)* exp(b); bの範囲は限られており、kの離散的な可能性の数は限られています。)

(ヒント#2:数値はおそらくx m = g(mf(x))の方がうまくいくでしょう。ここでf(x)= log 2 xおよびg(x)= 2 xです。)

于 2009-09-03T21:15:32.690 に答える
6

Jason S が言ったように、これは単位 x m = exp(m log x) を使用して行われます。ただし、実際には、切り捨てエラーに対処する必要があります。これが通常行われる方法だと思います

  1. 次の恒等式を使用します: x m = (2 n * x / 2 n ) m = 2 nm * (x/2 n ) mで、1 <= x/2 n < 2となる整数 n を見つけます。
  2. t = log2(x / 2 n ) を計算します。これは、十分に高度な Taylor 展開を使用するか、古き良き Newton-Raphson を使用して行うことができます。間隔 [1, 2[] での最大誤差が大きすぎないことを確認する必要があります。
  3. u = nm + tm を計算します。
  4. ここでの目標は 2 uを計算することです。2 u = 2 v * 2 u-vという事実を使用して、0 <= uv < 1 となる整数 v を見つけます。
  5. 友人の Taylor または Newton-Raphson を使用して、 w = 2 u-vを計算します。対象の区間は 0 <= uv < 1 です。
  6. あなたの答えは 2 v * w です。
于 2009-09-03T21:55:34.200 に答える