Altifigence Academy

3 / 20 · 概念

固定小数点出力の方針

入力スケール、負数の丸め、飽和、折り返しを区別します。

ビットは整数を格納し、スケールが意味を与える

xを整数Xと小数部Fビットで表し、x=X/2^Fとします。AとBに同じFを使います。積とアキュムレータの小数部は2Fビットになります。最終的な生の和Sを入力スケールへ戻すには2^Fで割ります。縮約がすべて終わってから1回だけ変換してください。各項を先に丸めると、一緒なら有意になる寄与を捨てる場合があります。

F=4なら[1.5,−0.5]は[24,−8]、[0.25,2.0]は[4,32]として格納します。生の内積は24×4−8×32=−160です。実数値は−160/256=−0.625で、F=4での出力整数は−10です。

負数の丸めを明示的にテストする

S=−17、F=4では、正確な出力整数は−1.0625です。算術右シフトは−2、ゼロ方向への切り捨ては−1になります。最近接偶数丸めでも−1です。したがって、算術シフトは「小数部を捨てる」のすべての解釈と置き換え可能ではありません。ちょうど中間の−24/16=−1.5と−40/16=−2.5では、偶数丸めはどちらも−2を選びます。

既定の変換では、和全体を最近接値へ丸め、中間値は偶数を選び、その後出力幅に飽和させます。絶対値について商qと余りrを計算します。rが除数の半分を超える場合、または半分に等しくqが奇数の場合は、qを1増やします。その後に元の符号を戻します。RTLでは最小の負数の絶対値に、より広い一時値が必要です。Nodeの参照モデルはBigIntを使います。

出力のオーバーフローを定義する

符号付き8ビット出力は−128..127を表します。丸めた値130は飽和なら127、折り返しなら−126です。−130は飽和なら−128、折り返しなら126です。どちらも意図的に選べますが、方針を明示してテストする必要があります。

生のアキュムレータと変換後の出力を別々に比較します。生の和が違うなら算術やスケジュールを、和は正しく出力が違うならスケール、丸め、飽和を調べます。手計算した境界例を残し、参照モデルとRTLの両方に同じ変換ミスが隠れないようにしてください。

自分で考えてみましょう

F=4、S=−56の最近接偶数丸めの結果と、F=4、S=−2080の飽和した8ビット出力を求めてください。

解説を見る

−56/16=−3.5は偶数の−4に丸められます。−2080/16=−130は、丸めた後に−128へ飽和します。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。