最小/最大または48ビット浮動小数点型MIL-STD-1750Aの最小値から最大値の範囲を計算しようとしています(PDF) (WIKI)。
例:範囲が2倍になる方法は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ビット形式の最大数は次の2進数として表すことができます。 39個の1 “とそれに続く880″で構成されます。)
(最小はこの値の負の値です。ゼロでなくてもゼロに最も近いものは、上記のように簡単に計算できます。可能な最小の(正の)仮数:0000001および可能な最小の指数:16進数で80、または10進数で-128)
FYI
一部の浮動小数点形式は、表現されていない非表示を使用します仮数の1
ビット(これにより、fのように、仮数に1ビットの精度が追加されます。次のようになります。すべての数値の最初の2進数(0を除く、または非正規化数、以下を参照)は1
であるため、その、そして私たちは余分な精度を持っています)。この特定の形式はこれを行わないようです。
他の浮動小数点形式では、非正規化仮数が許可されます。これにより、精度のビットを追加の(負の)累乗と交換することにより、最小の指数よりも小さい(正の)数値を表すことができます。これは、非表示の1ビットもサポートしない場合はサポートが簡単で、サポートする場合は少し難しくなります。
8,388,607 / 2 ^ 23は、仮数で得られる値です。 = 0x7FFFFFおよびexponent = 0x00。これはシングルビット値ではなく、 full 仮数とニュートラル、より具体的にはの値です。 zero 指数。
この値が直接8388607ではなく、除算が必要な理由(2 ^ 23によるため、より小さい)予想よりも)暗黙の 基数 は、仮数の後ではなく、仮数の前にあります。したがって、(符号ビット、基数ポイント、23個の1ビット)仮数と+/- 111111111111(ここでは基数ポイントなし、この場合は整数、127 )指数の場合。
mantissa = 0x7FFFFF with exponent = 0x7Fは、8388607 * 2 ^ 104に対応する最大値です。ここで、104は127-23から取得されます。ここでも、仮数には基数があるため、2の23乗を減算します。初めに。基数ポイントが最後にある場合、最大値(0x7FFFFF、0x7F)は実際には8,388,607 * 2 ^ 127になります。
とりわけ、単一ビット値を検討できる方法がいくつかあります。仮数。 1つはmantissa = 0x400000で、もう1つはmantissa = 0x000001です。基数または指数を考慮しない場合、前者は4,194,304、後者は1です。指数がゼロで基数を考慮すると、前者は0.5(10進数)、後者は0.00000011920928955078125です。最大(または最小)指数を使用して、最大および最小のシングルビット値を計算できます。
(仮数に先行ゼロがある後者の形式は、一部の数値形式では非正規化数と見なされ、正規化された表現は指数が-23の0x400000になることに注意してください)。
コメント
- 疑問が1つあります。 8,388,607 / 2 ^ 23を実行することにより、仮数の1ビットが表すことができるものが得られます。では、8,388,607 / 2 ^ 23 * 2 ^ 127が最大値をどのように表しているのでしょうか?
- @hariprasad、コメント形式で説明するのは難しいので、回答に追記します。
- 最小値はどこですか?タイトルで'が要求されました!
- @CharlieParker最小値と最大値がオフセットされている整数表現とは異なり、浮動小数点形式は符号を使用します&大きさの表現。大きさは指数と仮数で構成されます。その場合、符号の大きさの最大数は、(1)正(符号ビットは0)、(2)可能な最大の指数、および(3)可能な最大の仮数になります。最小数は同じです。符号ビットが変更されることを除いて、(1)負(符号ビットは1)ですが、(2)可能な最大の指数、および(3)可能な最大の仮数です。上で説明したように、最小数は-maxだけなので、
-
記号を付けるだけです。
回答
IEEE浮動小数点のレイアウト方法から借用して、高速比較を行うことができます:符号、指数、仮数。ただし、そのPDFでは、仮数と指数が逆になっていることがわかります。
つまり、比較するには、最初に符号ビットを確認する必要があります。どちらかが勝者でない場合は、指数を比較してから比較します。仮数。
一方が正でもう一方が負の場合、正が最大になります。
両方が正で、一方の指数が大きい場合、それが最大になります(両方の場合)負の場合は最小)
仮数の場合も同様です。
a<b?a:b
およびa>b?a:b