48ビット浮動小数点型MIL-STD-1750Aの最小値/最大値、または最低値から最高値の範囲を計算しようとしています (PDF)(WIKI) 。
例:ダブルレンジが1.7E +/- 308の場合
方程式を探してみましたが、見つけたものがうまくいくかどうかわかりません。
これらが私が必要としているものでさえも正しい場合、私はこれらをどこから始めればよいかよくわかりません。
誰かが私に知識を伝えて、これを解決するのを手伝ってくれませんか?
32ビット浮動小数点の最大値を表IIIに示します。
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
次のように、仮数/指数を(近い)10進値に分解できます。
7FFFFF <base-16> = 8,388,607 <base-10>.
23ビットの有意性があるため、8,388,607を2 ^ 23で割ります。
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
指数まで:
7F <base-16> = 127 <base-10>
そして仮数に2 ^ 127(指数)を掛けます
8,388,607 / 2^23 * 2^127 =
8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
最大の仮数が使用され、最大の指数であるため、これは最大の32ビット浮動小数点値です。
48ビットの浮動小数点は、16ビットの小さめの仮数を追加しますが、指数は同じサイズのままにします。したがって、最大値は16進数で次のように表されます。
mansissa=7FFFFFFFFF, exponent=7F.
繰り返しますが、
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
最大指数は127のままですが、[23 + 16 = 39で除算する必要があるので、] 2 ^ 39です。 127-39 = 88なので、2 ^ 88を掛けるだけです。
549,755,813,887 * 2^88 =
1.7014118346015974672186595864716 * 10^38
可能な最大の仮数と最大の指数を使用したため、これは最大の48ビット浮動小数点値です。
したがって、最大値は次のとおりです。
1.7014116317805962808001687976863 * 10^38, for 32-bit, and,
1.7014118346015974672186595864716 * 10^38, for 48-bit
48ビットの最大値は32ビットの場合よりもわずかに大きく、仮数の末尾に数ビットが追加されるため、これは理にかなっています。
(正確には、48ビット形式の最大数は、39の1とそれに続く88の0で構成される2進数として表すことができます。)
(最小値はこの値の負の値です。ゼロではなくゼロに最も近い値も、上記のように簡単に計算できます。最小の(正の)仮数:0000001と最小の指数を使用:16進数で80、または-128 10進数で)
ご参考までに
一部の浮動小数点形式では、仮数で表現されていない隠し1
ビットを使用します(これにより、仮数に1ビットの精度を追加できます。次のように、すべての数値の最初の2進数(0または非正規を除く、以下を参照)は1
であるため、その1
を格納する必要はありません。また、精度が少し高くなります)。この特定のフォーマットはこれを行っていないようです。
他の浮動小数点形式では、非正規化された仮数を使用できます。これにより、精度のビットを追加の(負の)ベキ乗数と交換することにより、最小の指数よりも小さい(正の)数値を表すことができます。 、もしそうなら少し難しい。
8,388,607/2 ^ 23は、仮数= 0x7FFFFFおよび指数= 0x00で得られる値です。これは単一ビット値ではなく、フル仮数部とニュートラル、またはより具体的には、ゼロ指数。
この値が直接8388607ではなく、除算が必要な理由(2 ^ 23によるため、予想よりも少ない)は、暗黙のradix point であるためです。はの後ではなく、仮数の前部にあります。したがって、+/-.111111111111111111111
(符号ビットとそれに続く基数ポイント、仮数には23個の1ビットが続きます)指数には+/- 111111111111(ここでは基数ポイントなし、整数のみ、この場合は127)。
仮数= 0x7FFFFFと指数= 0x7Fは、8388607 * 2 ^ 104に対応する最大値です。ここで、104は127-23から来ています。仮数には最初に基数ポイントがあるため、2の23乗を減算します。基数ポイントが最後にある場合、最大値(0x7FFFFF、0x7F)は実際に8,388,607 * 2 ^ 127になります。
特に、仮数の単一ビット値を検討する方法はいくつかあります。 1つは仮数= 0x400000、もう1つは仮数= 0x000001です。基数ポイントまたは指数を考慮しない場合、前者は4,194,304、後者は1です。指数がゼロで基数ポイントを考慮すると、前者は0.5(10進数)、後者は0.00000011920928955078125です。最大(または最小)指数を使用して、最大および最小の単一ビット値を計算できます。
(仮数部に先行ゼロがある後者の形式は、一部の数値形式では非正規化と見なされ、その正規化表現は指数が-23の0x400000になることに注意してください)。
高速比較のためにIEEE浮動小数点がどのように配置されているか、符号、指数、仮数から借りることができます。ただし、PDF仮数と指数が逆になっているのがわかります。
これは、比較するには、最初に符号ビットを確認する必要があることを意味し、1つが勝者でない場合は、指数を比較してから仮数を比較します。
一方が正で他方が負の場合、正が最大です。
両方が正で、1つの指数が大きい場合は最大になります(両方が負の場合は最小です)
仮数についても同様です。