浮動小数点演算
[Wikipedia|▼Menu]
(−1)0 × 1.5 × 160

仮数部は1未満でなければならないため、値を(この例では右へ)シフトする。ただし、基数が16で、コンピュータの内部表現は2進法であるため、シフト量は4ビットである(24 = 16)。加えて正規化し、その結果は次の通り。(−1)0 × 0.09375 × 161

次に指数部を、64をバイアスしたゲタ履き表現(エクセス64)で表現する。バイアスにより、0?127のビットパターンで、整数値−64?+63を表現するということになる(−64 + 64 = 0、63 + 64 = 127)。よって、今回の例では以下のようになる。(−1)0 × 0.09375 × 16(65 − 64)

2進法では、

符号部(1ビット):+ → 0

仮数部(24ビット):0.09375 → 000110000000000000000000

指数部(7ビット):65 → 1000001

浮動小数点は、最上位ビットから符号部、指数部、仮数部の順に符号化するため2進値:0 1000001 000110000000000000000000、16進値:41180000
指数部と仮数部を可変とする方式

任意精度演算と、従来の指数部と仮数部を共に固定長とする形式の中庸と言えるような方式が、いくつか提案されている。絶対値が1に近い値では指数部の桁数を短くし、仮数部の桁数を多くとって、よく使われる値を精度よく表現する。絶対値が極端に大きい値や小さい値には、精度とひきかえに指数部の桁数を増やすことで対応する。以下で述べる方式を提案している文献では、アプリケーションとして、通常の浮動小数点計算には、指数が大きくなり過ぎることがあって向かないとされているen:Graeffe's methodをうまく扱えたという例が示されている。
松井・伊理の表現法

松井正一と伊理正夫が提案した方式で、符号と絶対値による表現法である。論文中に示された例では、64ビットの倍精度浮動小数点数として、仮数部の長さnを示す情報6ビットと、(符号部を含む)mビットの指数部とnビットの仮数部(m+n = 58)からなる。彼らは、オーバーフローを起こさせないための、より大きい数やより小さい数の表現や、無限大などの例外的な値を含めた算術(IEEE標準の±∞や−0の扱いに似ているが、より拡張されている)も提案している。[6][7]
浜田のURR

浜田穂積が提案した方式[8]で、Universal Representation of Real numbersの意でURRと名付けられている[注釈 1]。−∞ ? 0 ? ∞ の区間を、次のように分割しながら、二進法による表現に対応付ける、というのが基本的な考え方で、「符号と絶対値」形ではなく、浮動小数点の表現としては比較的珍しい2の補数の形をしている。

100 = −∞

101 = −2

110 = −1

111 = −0.5

000 = 0

001 = 0.5

010 = 1

011 = 2 ? ∞

ここで±1の前後は、区間の両端の比が2なので、指数部の表現は終わったとみなすことができ、残りの桁は仮数部のように扱う(±1の前後は、以後は1/2で等差分割する)。次のように分割を続ける。

1000 = −∞

1001 = −4

1010 = −2

1011 = −1.5

1100 = −1

1101 = −0.75

1110 = −0.5

1111 = −0.25

0000 = 0

0001 = 0.25

0010 = 0.5

0011 = 0.75

0100 = 1

0101 = 1.5

0110 = 2

0111 = 4 ? ∞

以降は、符号ビットが0である0 ? 0.5 と 2 ? ∞ の区間に絞って説明する。

0 00000 = 0

0 00001 = 0.00390625 (1/256)

0 00010 = 0.0625 (1/16)

0 00100 = 0.25 (1/4)

0 01000 = 0.5 (1/2)

0 11000 = 2

0 11100 = 4

0 11110 = 16

0 11111 = 256 ? ∞

ここで、2 = 220、4 = 221、16 = 222、256 = 223 である。このように 0 や ±∞ を含む区間は「二重指数分割」する。

0 000000 = 0

0 000001 = 0.0000152587890625 (1/65536)

0 000010 = 0.00390625 (1/256)

0 000011 = 0.015625 (1/64)

0 000100 = 0.0625 (1/16)

0 000110 = 0.125 (1/8)

0 001000 = 0.25 (1/4)

0 111000 = 4 (22)

0 111010 = 8 (23,3=(2+4)/2)

0 111100 = 16 (24)

0 111101 = 64 (26,6=(4+8)/2)

0 111110 = 256 (28)

0 111111 = 65536 ? ∞

このように、区間の両端の比が2より大きい場合は、「等比分割」する。

以上のような操作の結果として、指数部が0以上の場合は

"0 10" = 0

"0 11(1がn個)0(n個のビット列Bn)" = 1Bn (ガンマ符号の桁数出力とその後の"1"をビット反転したもの)

指数部が0未満の場合は

"0 01" = 上述の"0 10"の符号ビット以外をビット反転させたもの = 2進数"0"をビット反転させたもの = −1

"0 00(0がn個)1(n個のビット列Bnをビット反転させたもの)" = 上述の"0 11(1がn個)0(n個のビット列Bn)"の符号ビット以外をビット反転させたもの = 2進数"1Bn"をビット反転させたもの = −(1Bn)−1

ビット反転して0以上にした後に上述の方法を適用した指数部を、再びビット反転したものとなる。こうして、負数に拡張されたガンマ符号によって自分の長さを含む指数部と、残りの仮数部から成る、と見ることができるような表現が得られる。

利点として、ビット表現を固定小数点数と解釈しても値・絶対値の大小関係が一致しているため、

単精度と倍精度、さらには4倍精度や、一部ビットをデータ型判別などの別用途に転用している処理系で用いられる7bitや30bitなど、任意のビット長表現との相互変換・丸め操作が、この方式では単に最下位ビットを追加したり切り捨てるだけで良い

大小関係の比較演算や符号反転に必要なハードウェア・計算量が、整数でのそれと同一

という点が挙げられる。また、1の近くでは桁数のほとんどが仮数部となるので精度が高い。

欠点としては、精度が変化するため従来の精度一定を前提としたノウハウに修正が必要かもしれない、−∞を除くワードのあらゆるビット表現に浮動小数点数としての意味が与えられるため、例外的な値を表現する方法を別に考えなければいけない、などといった点がある。浜田は1000...を符号なしの∞(射影モード[注釈 2]用。符号なしの0と対応する)とし、表現可能な最大と最小の絶対値を持つ値を、具体的にその値を表すのではなく±∞と±0を表現するものとする(0は、通常の0を符号なしの0とし、符号付きの+0や−0は、無限大で割った結果など例外的な値としてのみ現れる)、という方法を提案している。

この表現法の初出は1981年だが[9]、1983年に改良版が提案されている[10]のでそちらをまずは参照すべきである。[11]

いくつかの実装の報告[12][13]や改良の提案[14][15][16][17][18][19]などがある。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:47 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef