web-dev-qa-db-ja.com

浮動小数点数の最小値/最大値を計算する方法は?

48ビット浮動小数点型MIL-STD-1750Aの最小値/最大値、または最低値から最高値の範囲を計算しようとしています (PDF)(WIKI)

例:ダブルレンジが1.7E +/- 308の場合

方程式を探してみましたが、見つけたものがうまくいくかどうかわかりません。

私が見つけた最初の方程式は first equation

2番目は second equation

これらが私が必要としているものでさえも正しい場合、私はこれらをどこから始めればよいかよくわかりません。

誰かが私に知識を伝えて、これを解決するのを手伝ってくれませんか?

8
CodeMonkey

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になることに注意してください)。

8
Erik Eidt

高速比較のためにIEEE浮動小数点がどのように配置されているか、符号、指数、仮数から借りることができます。ただし、PDF仮数と指数が逆になっているのがわかります。

これは、比較するには、最初に符号ビットを確認する必要があることを意味し、1つが勝者でない場合は、指数を比較してから仮数を比較します。

一方が正で他方が負の場合、正が最大です。

両方が正で、1つの指数が大きい場合は最大になります(両方が負の場合は最小です)

仮数についても同様です。

1
ratchet freak