このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
非正規数は,浮動小数点の文献で以前は非正規化数と呼ばれており,浮動小数点演算においてゼロ周辺のアンダーフローのギャップを埋めます。非正規値とは,0.0
に近すぎるため正規化値として表記できない,特殊なカテゴリの浮動小数点値です。非正規数の仮数の先頭はゼロです。浮動小数点の加算と減算を行うときに,非正規数によってアンダーフローが回避されます。
非正規数の使用によって正規表現を上回る精度が提供されます。仮数の先頭にゼロを使用することで,正規表現がその最小指数に達した後のさらに小さい値を表現します。値が0.0
に近づくと,拡張範囲と精度がトレードオフされます。アプリケーションで追加の範囲が必要である場合、非正規数は便利です。
ただし,リアルタイムシステムで非正規数を使用すると,実行のレイテンシが著しく増加し,設計マージンが過剰になり,リアルタイムのオーバーランが発生します。シミュレーションまたは生成コードが非正規数を生成または使用する計算を実行すると,正規数による類似計算よりも実行速度が50倍遅くなる可能性があります。非正規数計算の実際のシミュレーションまたはコード実行時間は,コンピューターの動作環境によって異なります。通常,デスクトッププロセッサの場合,非正規数計算の実行時間は,正規数の同様の計算より5倍かかります。
非正规计算ののレイテンシののためにに実実に実実に実がたり,オーバーランする可性をするに,以に,以に,以以ににをいいい
モデルでのウォッシュアウト,フィルターなどの入力や主な演算では,入力または計算された非正規値はすべて手動で削除してゼロにします。例については,非正規数をゼロにフラッシュするを参照してください。
単精度の32ビット浮動小数点数の非正規値を検出するには,次の手順に従います。
MATLAB®ホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。
>> smallstnormalsingle = realmin('单身')
float.h
で定義されたFLT_MIN
はrealmin('单身')
と等価です。以下のの范囲内で値を検索し
0 < fabsf(x) < smallstnormalsingle . 0 < fabsf(x
64倍精度のビット浮動小数点数の非正規値を検出するには,次の手順に従います。
MATLABホストで最小正規数を検出します。コマンドウィンドウで以下のように入力します。
>> smallstnormaldouble = realmin('double')
float.h
で定義されたDBL_MIN
は最小正浮点数(双)
と等価です。非正規値を検出するため,以下の範囲内で値を検索します。
0 < fabs(x) < smallstnormaldouble
(非正規数に対するシミュレーションの動作)パラメーターを刷新为零(FTZ)
に設定して,算術演算からのすべての非正規結果についてのflush-to-zero動作をエミュレートします。詳細については,非正規数に対するシミュレーションの動作を参照してください。
プロセッサでは,flush-to-zeroモードを設定するか,コンパイラで非正規数を無効にするオプションを指定します。flush-to-zeroモードでは,非正規数が浮動小数点演算に対する入力である場合,非正規数は0として扱われます。アンダーフローの例外は,flush-to-zeroモードでは起こりません。
たとえば,英特尔®プロセッサでは,MXCSRレジスタのflush-to-zero(保税区)およびdenormals-are-zero(戴兹)フラグが浮動小数点計算を制御します。Linuxのgccコンパイラの場合,-ffast-math
は突発的アンダーフロー(保税区)であるflush-to-zeroを設定しますが,-O3 -FFATT-数学
は非正規数を使用して段階的アンダーフローに戻します。
詳細は,IEEE®754年標準の浮点运算标准を参照してください。
このモデルは,非正規数の使用によりシミュレーション時間が5倍に増加する様子を示します。
モデルex_subnormalを開きます。[ゲイン]は非正規値最小正浮点数(双)/ 2
に設定されています。
シミュレーションを実行するするに,コマンドウィンドウでk = 1:5,抽搐;sim(“ex_subnormal”);toc,结束
と入力します。非正規値を使用するシミュレーションの経過時間を確認すると,以下のようになります。
>>为k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间是9.909326秒。运行时间是9.617966秒。运行时间是9.797183秒。运行时间是9.702397秒。运行时间是9.893946秒。
(获得)を非正規値ではない数2
に設定します。
> > set_param (“ex_subnormal /增益”,“获得”,' 2 ');
シミュレーションを実行するするに,コマンドウィンドウでk = 1:5,抽搐;sim(“ex_subnormal”);toc,结束
と入力します。非正規値を使用しないシミュレーションの経過時間を確認すると,以下のようになります。
>>为k = 1:5,抽搐;sim卡(“ex_subnormal”);toc,结束运行时间是2.045123秒。运行时间是1.796598秒。运行时间是1.758458秒。运行时间是1.721721秒。运行时间是1.780569秒。
この例では,単精度非正規数をゼロにフラッシュする方法を示します。
モデルex_flush_to_zeroを開きます。
重复序列楼梯
は2の0乗からの-165乗の値までの数列を生成します。数列はゼロに近くなります。
ConditionRealScalar
は,realmin('单身')
より小さい非正規の単精度値をゼロにフラッシュします。
MATLAB関数ブロックlog2
は重复序列楼梯
出力の2を底とする対数を生成します。具体的には,log2
-165年は0からの数値を生成します。
[シミュレーション]、[ステップを戻す]、[シミュレーションステップの設定)ペインで次を実行します。
[ステップを戻す機能を有効にする]を選択します。
(次の時間に達したときにシミュレーションを一時停止)を選択して121
と入力します。
モデルウィンドウで,シミュレーションを実行します。シミュレーションはT = 121
で停止します。表示される値は次のとおりです。
ConditionRealScalar
出力がゼロに近づきます。
重复序列楼梯输出
がゼロに近づきます。
シミュレーションをT = 127
まで進めます。ConditionRealScalar
は非正規値出力を重复序列楼梯
からゼロにフラッシュします。
引き続きシミュレーションを進めます。ConditionRealScalar
は非正規単精度値出力を重复序列楼梯
からゼロにフラッシュします。T = 150
の場合,重复Squence楼梯
の出力自体はゼロです。