浮動小数点表現が負の数を示すために2の補数ではなく符号ビットを使用する理由


20

浮動小数点数の縮退したケースと見なすことができる固定小数点表現を検討してください。負の数に2の補数を使用することは完全に可能です。しかし、浮動小数点数に符号ビットが必要なのはなぜですか。仮数ビットが2の補数を使用してはいけませんか?

また、指数ビットは、符号付きの大きさの表現(仮数ビットに類似)や2の補数表現の代わりにバイアスを使用するのはなぜですか?

更新:明確にしないとすみません。浮動小数点表現がどのように形作られるのかの理由を探していました。選択肢間に強力な実装のトレードオフがない場合、誰かが浮動小数点表現の歴史的な側面を説明できますか?

回答:


7

問題の2つのエンティティが同じ「ユニット」と同じ「幅」を持っている場合、2の補数は理にかなっています。幅とは、たとえば、NとMが異なるNビット数とMビット数を追加する場合、2の補数を使用しない方が良いということです。浮動小数点数の場合、単位の問題があります。指数が異なる場合、仮数の1つを精神的にシフトし、今までと同じ問題(幅)になります。

指数ビットについては、符号+大きさの代わりにバイアスを使用することで、もう1つの値を取得します(そうでない場合は+0と-0になります)。ここで、2の補数は、数値を乗算または除算するときに意味を持ちます(指数を加算または減算するため)が、加算または減算するときはあまり意味がありません。

編集:注釈者は、符号拡張を使用して、異なる長さの2の補数整数を追加できると述べました。オーバーフローの検出にはいくつかの問題もありますが、それも修正可能です。要約すると、十分に注意すれば、おそらく2の補数を使用できます。(乗算と除算も処理する必要があります。)


4
「NとMが異なるNビット番号とMビット番号を追加する場合は、2の補数を使用しない方が良いでしょう」-少し明確にできますか?MSBを使用して2の補数表現を使用して数値に符号拡張することは完全に可能であると考えています。たとえば、4'b1111は5'b11111、および4'b0111-> 5'b00111に拡張されます。これを浮動小数点演算ロジック内の既存のバレルシフターに追加するのは簡単ではないでしょうか?
koo

ご回答ありがとうございます!質問を編集したので、現在の浮動小数点の原因をより明確に尋ねます。
koo

4

ウィキペディアから:

2の補数システムには、加算、減算、乗算の基本的な算術演算が符号なし2進数の演算と同じであるという利点があります...

2の補数は、非常に便利な負の数の表現です。それがまったくそれを使用する理由です。

仮数と指数のペアは、浮動小数点数の表現です。浮動小数点数を使用する場合、ほとんどの場合、仮数のみまたは指数のみで算術演算を実行するわけではありません。


4

しかし、なぜ浮動小数点数に符号ビットが必要なのですか

誤った仮定。必要ありません。仮数に2の補数を使用する浮動小数点形式に出会ったことは確かですが、名前については掘り下げなければなりません。

私は数値解析の専門家には程遠いですが、ゼロに署名することは彼らにとって重要だと思います。おそらく、1の補数よりも操作が簡単です。それはおそらくIEEE-754の選択における基準でした。

また、なぜ指数ビットは符号付き大きさの表現の代わりにバイアスを使用するのですか

繰り返しますが、それは必要のないものであり、いくつかは異なる方法で行いました。

これは、指数で行われる一連の操作に対してハードウェア実装を行う方が簡単な表現です(ここでは-0の表現は必要ありません)。

その選択の結果の1つは、NaNを気にしない場合は符号付き整数比較を使用してFP数を比較できることです。これはおそらくいくつかの基準でした(NaNが特別な処理を必要とするという事実は、 IEEE-754の場合)。


符号付き整数の比較では、負のFP番号が後方にランク付けされます。それらが適切にランク付けされるためには、何らかの補数形式が必要であり、1の補数がおそらく最良です(負のものは... 110.1111 ...で、左右に無限のものがあります)。
-supercat

3
MIL-STD-1750Aは、おそらく2の補数の浮動小数点表現を指定する最も広く使用されているプロセッサアーキテクチャです。セクション4.1:「命令セットは、2の補数表現で 16ビット固定小数点単精度、32ビット固定小数点倍精度、32ビット浮動小数点および48ビット浮動小数点拡張精度データをサポートするものとします。」(エンファシスマイニング) 。
-njuffa

2

IEEE 754は、2の補数または1の補数ではなく、符号/大きさを使用します。

2の補数には、正と負の範囲が同一ではないという欠点があります。すべてのビットパターンが有効な場合、-xを簡単に計算できない数値xがあります。それは良くないね。別の方法は、無効なビットパターンが存在することです。これも悪いことです。IEEE 754には、64ビットまたは32ビットの浮動小数点の無効なビットパターンがないため、そのことを心配する必要はありません。

補数は、乗算/除算をより複雑にします(符号付きの大きさでは、符号をxorし、仮数を符号なしの数として扱います)。足し算と引き算については、自分の補数で足し算と引き算を考えたくありません。頭を痛めます。


この回答の最初の段落は、符号/大きさに欠点がないことを示唆しています。符号/大きさには+/- 0があり、2の補数よりも複雑な演算が行われます。
プラクセオリック

+/-ゼロを持つことは、問題であると同時に機能でもあります。たとえば、小さな数字xを10 ^ 100で除算すると、xの符号を保持したまま+0または-0が得られます。
gnasher729

1

符号付きゼロがあると、数値計算に役立つ可能性のある表現力が向上します。ウィキペディアのページ「Signed zero」には次のように記載されています。

IEEE 754に符号付きゼロを含めることで、特に複雑な初等関数で計算するときに、いくつかの重大な問題数値精度達成するのがより簡単になると主張されます

IEEE 754浮動小数点の主な設計者の1人であるWH Kahanは、これらの理由から符号付きゼロの支持者です。彼の意見はおそらく大きな重みを持っているでしょう。


1

浮動小数点計算は正確な値ではなくおおよその値を生成することを理解することが重要だと思います。つまり、浮動小数点計算でエンコードされた値Xが得られる場合、これは理論的に理想的な値を表し、ほぼ確実にXではなく、範囲[X .. X + e){ここで 'e'は 'つまり、XとX + e}の間に浮動小数点数はありません。より具体的には、浮動小数点ゼロは、おそらく正確にはゼロではないが、非ゼロの浮動小数点エンコード値で表すには小さすぎる理想的な数値を表します。

それを考えると、符号と大きさの表現を使用すると、符号化でゼロまたは理想的な値が正または負のどちら側にある正確に「記憶」することができます。これは、特定の複雑な(「a + bi」の意味で)計算で重要です-複雑な->複雑な関数は多くの場合「多値」であるため、適切な計算のためには「分岐カット」の位置に注意を払うことが重要です。符号付きゼロは、これらの分岐カットの位置を意味的にマークします-プラス側で行われる計算は、マイナス側の計算とは異なります。


1
浮動小数点計算では正確な値が生成されます。それらは、数学的な実数が生成する値とわずかに異なります。浮動小数点数は、範囲ではなく1つの数値を表します。
gnasher729

0

ほとんどの浮動小数点形式は、バイナリシステムでは、非最小指数の非ゼロ値は仮数の最上位ビットとして「1」を持つという事実を利用しています。したがって、仮数に23ビットフィールドがあるシステムでは、正数の仮数は0から8,388,607の範囲ではなく、8,388,608から16,777,215の範囲です。正の数である場合とそうでない場合がある数値の仮数は、-16,777,215から-8,388,608および+8,388,608から+16,777,215です。2の補数はゼロを「スムーズに」計算する必要がある場合に最適な数値形式ですが、仮数の値の不連続な範囲は、2の補数を使用するかどうかに関係なく、計算がゼロを超えてスムーズに動作できないことを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.