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へ飽和します。