0

SurfaceFormat.Rgba64 を使用して HLSL でレンダリングする場合、[0, 1] の範囲しかありません。これを回避するには、浮動小数点の後に数値の範囲全体 (正しい用語がわからない?) を使用したいと考えています。

これを行うには、2 つの定数を使用して数値を左 (16BIT_MULTIPLIER) と右 (16BIT_INVMULTIPLIER) にシフトします。

16BIT_MULTIPLIER = 1000
16BIT_INVMULTIPLIER = 1 / 16BIT_MULTIPLIER

数値を右にシフトして正しい精度を維持できる最大量は? 言い換えれば、16BIT_MULTIPLIER の最大値は何ですか?

4

1 に答える 1

1

標準の 32 ビット IEEE 754 浮動小数点値では、数値の最上位ビットと最下位ビットの最大比率は 2 23です。これは、浮動小数点エンコーディングには仮数 (または小数) 用に 24 ビット (「暗黙のビット」を含む) があるためです。したがって、たとえば最上位ビットが 2 23で最下位ビットが 2 0 (1) であったり、最上位ビットが 2 12で最下位ビットが 2 -11であったりします。あなたの場合、最上位ビット 2 -1と最下位ビット 2 -24を使用したい場合があります。マッピング先の範囲 ([0, 1]) を指定しますが、マッピング元の範囲は指定しないため、使用する倍率を指定できません。

[0, 65536) の範囲の符号なし 16 ビット数値からマッピングする場合、1/65536 の倍率を使用できます。(多くの言語では1./65536、浮動小数点定数を取得するように記述し1/65536ます。これはゼロに評価される整数式になります。) このスケーリングにより、すべての数値が、数値の「下」で利用可能な精度でターゲット範囲にマップされますが、数値を追加したり、マグニチュードを増加させるその他の操作を行ったりするためのマージンを残さないでください。結果を [0, 1] の間隔に保ちながら、より多くの演算の余地を残したい場合は、比率を大きくする (スケーリング ファクターを小さくする) 必要があります。

倍率には 2 の累乗を使用する必要があります。2 のべき乗で乗算しても、2 進浮動小数点では丸め誤差はありません。10 の累乗またはその逆数 (2 進浮動小数点では 10 の累乗の逆数を正確に表すことができないため、これらは必然的に概算になります) を乗算すると、通常、丸め誤差が発生します。

標準の 64 ビット IEEE 浮動小数点値では、最大比率は 2 52です。

16BIT_MULTIPLIER の最大値を尋ねますが、これが実際に必要な値である可能性は低いです。数値の下位ビットが 2 -149に達するまで、 16BIT_MULTIPLIER を好きなだけ大きくすることができます。その時点で、指数範囲 (上位ビットの場合は 2 ~126 ) の終わりに達し、それより小さい値のビットは (32 ビット浮動小数点で) 表すことができなくなります。

于 2012-07-16T12:18:09.863 に答える