(57)【要約】浮動小数点数は２進数の文字列にエンコードされる。２進数の文字列の左から右の比較は、浮動小数点数の相対的な大きさを決定する。浮動小数点数が負である場合には、浮動小数点数の絶対値がとられる。結果として２進数の文字列の変換は次いで補数をとられる。浮動小数点数が０である場合には、２進数の文字列に対する値が指定される。値は「１」の後に複数の「０」が続く。２進数の文字列の各々のバイトの一部は、２進数の文字列に別のバイトが続くかどうかを決定する。２進数の文字列の各々のバイトのビットの値は、別のバイトが続くかどうかを決定する。別の局面において、浮動小数点数は、浮動小数点数の仮数および指数の関数として長さを有する２進数の文字列にエンコードする。
2008521142.tif 000002
【特許請求の範囲】
【請求項１】
浮動小数点数をエンコードする、コンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を、左から右の２進数の文字列の比較が、該浮動小数点数の相対的な大きさを決定するように、該２進数の文字列にエンコードすることと
を含む、方法。
【請求項２】
請求項１に記載のコンピュータにインプリメントされた方法であって、
前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードすることと、
該浮動小数点数の前記２進数の文字列の補数をとることと
をさらに含む、方法。
【請求項３】
請求項１に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数が０である場合には、前記２進数の文字列の値を指定することをさらに含む、方法。
【請求項４】
請求項３に記載のコンピュータにインプリメントされた方法であって、前記値は、「１」に複数の「０」が続く、方法。
【請求項５】
請求項１に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトの一部は、該２進数の文字列において別のバイトが続くかどうかを決定する、方法。
【請求項６】
請求項５に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトのビットの値は、別のバイトが続くかどうかを決定する、方法。
【請求項７】
請求項１に記載のコンピュータにインプリメントされた方法であって、各々の固有の浮動小数点数は固有の２進数の文字列にエンコードされる、方法。
【請求項８】
請求項１に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数は現在のデータを表す、方法。
【請求項９】
浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を、該浮動小数点数の仮数および指数の関数としての長さを有する２進数の文字列にエンコードすることと
を含む、方法。
【請求項１０】
請求項９に記載のコンピュータにインプリメントされた方法であって、
前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードすることと、
該浮動小数点数の前記２進数の文字列の変換の補数をとることと
をさらに含む、方法。
【請求項１１】
請求項９に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数が０である場合には、前記２進数の文字列の値を指定することをさらに含む、方法。
【請求項１２】
請求項１１に記載のコンピュータにインプリメントされた方法であって、前記値は、「１」の後に複数の「０」が続く、方法。
【請求項１３】
請求項９に記載のコンピュータにインプリメントされた方法であって、各々の固有の浮動小数点数は、固有の２進数の文字列にエンコードされる、方法。
【請求項１４】
請求項９に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数は現在のデータを表す、方法。
【請求項１５】
浮動小数点数をエンコードする、コンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を２進数の文字列にエンコードすることと
を含み、
該２進数の文字列の各々のバイトの一部は、該２進数の文字列において別のバイトが続くかどうかを決定する、方法。
【請求項１６】
請求項１５に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトのビットの値は、別のバイトが続くかどうかを決定する、方法。
【請求項１７】
請求項１５に記載のコンピュータにインプリメントされた方法であって、各々の固有の浮動小数点数は、固有の２進数の文字列にエンコードされる、方法。
【請求項１８】
請求項１５に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数は、現在のデータを表す、方法。
【請求項１９】
浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を２進数の文字列にエンコードすることと
を含み、
該エンコードする処理は、全浮動小数点数によって動作する、方法。
【請求項２０】
請求項１９に記載のコンピュータにインプリメントされた方法であって、
前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードすることと、
該浮動小数点数の該２進数の文字列への変換の補数をとることと
をさらに含む、方法。
【請求項２１】
請求項１９に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数が０である場合には、前記２進数の文字列の値を指定することをさらに含む、方法。
【請求項２２】
請求項２１に記載のコンピュータにインプリメントされた方法であって、前記値は「１」に複数の「０」が続く、方法。
【請求項２３】
請求項１９に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトの一部が、該２進数の文字列において、別のバイトが続くかどうかを決定する、方法。
【請求項２４】
請求項２３に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトのビットの値は、別のバイトが続くかどうかを決定する、方法。
【請求項２５】
請求項１９に記載のコンピュータにインプリメントされた方法であって、各々の固有の浮動小数点数は、固有の２進数の文字列にエンコードされる、方法。
【請求項２６】
請求項１９に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数は現在の値を表す、方法。
【請求項２７】
コンピュータ読み取り可能なプログラムコードを具体化されたプログラム可能なコンピュータプロセッサと共に使用可能なコンピュータプログラム製品であって、コンピュータ読み取り可能なプログラムコードを備え、該プログラムコードは、該２進数の文字列の左から右への比較が浮動小数点数の相対的な大きさを決定するように、該浮動小数点数を２進数の文字列にエンコードする、製品。
【請求項２８】
請求項２７に記載のコンピュータプログラム製品であって、コンピュータ読み取り可能なプログラムコードをさらに含み、該コードは、前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードし、該浮動小数点数の前記２進数の文字列の変換の補数をとる、製品。
【請求項２９】
請求項２７に記載のコンピュータプログラム製品であって、コンピュータプログラムコードをさらに含み、該コードは、前記浮動小数点数が０の場合には、前記２進数の文字列の値を指定する、製品。
【請求項３０】
請求項２７に記載のコンピュータプログラム製品であって、前記値は「１」に複数の「０」が続く、製品。
【請求項３１】
浮動小数点数をエンコードするためのコンピュータシステムであって、
浮動小数点数を提供するための手段と、
浮動小数点数を、文字列の左から右の２進数の比較が、該浮動小数点数の相対的な大きさを決定するように、該２進数の文字列にエンコードするための手段と
を備える、システム。
【請求項３２】
請求項３１に記載のコンピュータシステムであって、
前記浮動小数点数が負である場合に、該浮動小数点数の絶対値をエンコードするための手段と、
該浮動小数点数の２進数の文字列の変換の補数をとるための手段と
をさらに含む、システム。
【請求項３３】
請求項３１に記載のコンピュータシステムであって、前記浮動小数点数が０である場合に、前記２進数の文字列の値を指定するための手段をさらに備える、システム。
【請求項３４】
請求項３１に記載のコンピュータシステムであって、前記値は「１」の後に複数の「０」が続く、システム。
【発明の詳細な説明】
【技術分野】
【０００１】
（国内優先権の主張）
本発明は、２００４年１１月１７日に出願され、「Ｍｅｔｈｏｄ  ｏｆ  Ｍａｐｐｉｎｇ  ａｎｙ  Ｍａｔｈｅｍａｔｉｃａｌ  Ｆｉｎｉｔｅ  Ｆｌｏａｔｉｎｇ−Ｐｏｉｎｔ  ｔｏ  ａｎ  Ａｒｒａｙ  ｏｆ  Ｏｎｅ  ｏｒ  Ｍｏｒｅ  Ｂｙｔｅｓ」と題された仮特許出願６０／６２９，１２８号に対して優先権を主張するものである。
【０００２】
（本発明の技術分野）
本発明は、概して数のデジタル的なエンコードおよびデコードに関連し、特に浮動小数点数を２進数の文字列にエンコードするシステムおよび方法に関連している。
【背景技術】
【０００３】
（本発明の背景技術）
２進数のデジタルコンピュータは、数（例えば、整数および浮動小数点数）を記憶し、処理するために長い間使用されている。全ての現代のコンピュータ言語ではないが、１つの種類から別の種類の数を操作するための準備を有する。コンピュータは、効果的および意味のある様式において大量の数を扱うために必須である。アナログコンピュータが連続の数（例えば、実数領域）を動作するが、デジタルコンピュータは不連続の可算数（例えば、整数および有理数）を動作し、他の全てを近似しなければならない。一部の特別な目的のアナログコンピュータは、リアルタイムの製品（例えば、宇宙産業）にさえも使用され得るが、今日使用されるたいていのビジネス用および個人用コンピュータはデジタルであり、「ビット」を用いる数の表記にエンコードされた２進数のシステムに基づいている。現代のコンピュータの全てではないが、それらのビットは「バイト」と呼ばれる８個のビットにグルーピングまたはパケットに分割する。
【０００４】
数は、多くの分類を有する。「自然」数は１、２、３、４、５、などである。「非負整」数（ｗｈｏｌｅ  ｎｕｍｂｅｒ）は、０、１、２、３、４、５、などである。非負整数は全ての自然数を含む。「整」数は、非負整数と同様にそれらの負の値からなる。すなわち、０、１、−１、２、−２、３、−３、などである。整数は非負整数を全て含む。「有理」数は、整数を非負整数で割った場合に生じるような数である（例えば、０、１、−２、２／５、−３／４、２２／７など）。有理数は、整数を全て含む。「無理」数は整数を非負整数で割ることにより表し得ない数である。同時に、有理数および無理数は「実」数の集合を構成する。
【０００５】
浮動小数点のナンバリングは、数を示すことに対する、表記、慣習またはシステムである。浮動小数点数は、実際には小数点で分割された２つの整数である（例えば、１２３．４５、５５５．０および０．００６２７）。小数点の左にある整数は、浮動小数点数の「整数部分」と呼ばれ、小数点の右にある整数は、浮動小数点数の「小数部分」と呼ばれる。全ての浮動小数点数は有理数であるが、一部の有理数のみが、浮動小数点数として示される。例えば、有理数５／４は浮動小数点数１．２５に等しい。有理数４／３は浮動小数点数の表記を有さない。しかしながら、１．３３３３３３．．．の省略形は、しばしば、３を無限に繰り返す表記のために使用される。しかしながら、デジタルコンピュータは、有限のメモリを有し、結果として浮動小数点ディジットの有限の数しか記憶できない。有限の制限は、このような数の近似の表現を制約し、多くの有理数に対して適用し、全ての無理数に対して確実に適用する。
【０００６】
デジタルコンピュータは、不連続な構造（例えば、整数）の算出に限定される。２つの整数、整数の分子および全体の分母、を一緒に記憶することによって、有理数は完全にモデル化され得る。しかしながら、このストラテジは滅多に実践されない。代わりに、２つの整数に対してよりも多くのディジットが浮動小数点数のバイトにパックされ得るので、浮動小数点数が使用され得る。さらに、２つの浮動小数点数は除法を必要とすることなしに比較され得る。浮動小数点数のセットは、効果的にソートされ得、グループ化され得、タスクはデジタルコンピュータにとって理想的である。
【０００７】
最終的に、デジタルコンピュータ内にモデル化される数は、「エンコード」と呼ばれる処理で、ビットのフィールドに写像されなければならない。整数および浮動小数点数をエンコードするための、提案されたおよびインプリメントされた多くの方法がある。整数を写像する最も有名な方法は、２の補数を使う方法（２’ｓ  ｃｏｍｐｌｅｍｅｎｔ  ｍｅｔｈｏｄ）と呼ばれ、Ｉｎｔｅｌ  Ｐｅｎｔｉｕｍ（登録商標）プロセッサにおいて使用される。この方法において、最も左のビットは負の整数に対して「１」であり、他の全てに対しては「０」である。浮動小数点数をエンコードする工業規格の方法は、ＩＥＥＥ単精度および倍精度フォーマットである。
【０００８】
ＩＥＥＥ７５４エンコード方法は、ある設計制約を最適化するように設計されている。ＩＥＥＥ７５４エンコード方法において、固定された数のバイトが割り当てられる。例えば、単精度方法は全ての浮動小数点数を４個のバイトにエンコードする。倍精度方法は、全ての数を８個のバイトにエンコードする。最も左のビットは、数の符号を表記する。エンコードにおける全てのバイトが０である場合には、浮動小数点数は０を表す。負の数に対する符合ビットが「１」、他の数に対する符号ビットが「０」であることに、論理的に従う。全てのビットの組み合わせは、適切な翻訳を有し、適切な翻訳は、出来るだけ多くの数を固定された数のバイトに効果的にエンコードする。一部のビットパターンは、特別な値をエンコードする（例えば、正の無限大、負の無限大およびＮａＮ（数ではない））。エンコードは論理演算装置（ＡＬＵ）および他の数学的プロセッサのために最適化されている。エンコード方法は、ビットを３つのグループ（符号（Ｓ）ビット、仮数（または精度）（Ｍ）ビットおよび指数（Ｅ）ビット）に分割する。例えば、４バイトの単精度エンコード方法は、その３２ビットをＳＥＥＥＥＥＥＥ  ＥＭＭＭＭＭＭＭ  ＭＭＭＭＭＭＭＭ  ＭＭＭＭＭＭＭＭに分割する。すなわち１個の符号ビットに８個の指数ビットが続き、２３個の仮数ビットが続く。これらのエンコード方法における一部のビットパターンは、同じ数を表し得る。例えば、００００００００  ００００００００  ００００００００  ００００００００は、０を表す。しかし、最も左のビットを「１」に変化させると、その結果が負の０となり、負の０は正の０と同じ値である。加えて、浮動小数点数が非常に０に近くなる場合（例えば、１．２３４５６７ｅ−３０）には、異なるエンコード方法（非正規化（ｄｅ−ｎｏｒｍａｌｉｚａｔｉｏｎ）と呼ばれる）が、固定された数のバイトを有するという制約内に維持する間、有効ディジットの損失を最小にするために使用される。
【０００９】
これらの標準エンコード方法は固定された数のバイトを定義するので、浮動小数点数の範囲および精度は制限される。例えば、単精度方法は７より大きい１０進数のディジットを表し得ない。すなわち、２３個の２進数の仮数ビットは、２３個の底２のディジットを底１０のディジットの数に変換するためにＬｏｇ（２）を掛けられる。「単」精度浮動小数点数方法は指数に対して８個のビットを割り当て、この方法は、−１２８〜＋１２７という「符号化された（ｓｉｇｎｅｄ）」２進数の範囲を可能にする。１０進数においては、範囲は約−３８〜＋３８になり、すなわち１２８＊Ｌｏｇ（２）は約３８である。従って、「単」精度浮動小数点数は、１ｅ３９より大きな数を記憶し得ない。浮動小数点数をエンコードするための実在のストラテジは、「速さ」および「空間」の考慮のために最適化され、大量の可能性のある数値の組み合わせを固定された数のバイトにパックする。
【００１０】
１つのエンコードされた浮動小数点数を別のものと比較する場合には、双方のエンコードされた数は、一方が、他方よりも大きい、他方に等しい、または他方よりも小さいと決定され得る前に初めにデコードされなければならない。浮動小数点数の全てのバイトは、比較が発生し得る前に、メモリに読み取られ、機能的に変換され（すなわちデコードされ）なければならない。
【００１１】
現代のプログラミング言語において、ならびに現代のプロセッサにおいて、数をエンコードするための多くの異なる方法を見出すことができる。整数においては、８ビット「ｂｙｔｅｓ」、１６ビット「ｓｈｏｒｔｓ」、３２ビット「ｉｎｔｓ」、６４ビット「ｌｏｎｇｓ」がある。このような全ての数は、負の数を含むように「符号化」され得、または負でない数のみを許可するために「符号化され得ない」。加えて、多くのプロセッサは、「リトルエンディアン」または「ビッグエンディアン」ストラテジと呼ばれるエンコードにおいてバイトを逆転させる。浮動小数点数は種々のカテゴリ（例えば、３２ビット「単精度」、６４ビット「倍精度」、８０ビット「１０進数」）を有する。このような数のフォーマットの全ては、文字列の「プリント可能な」表記をも有する。１つのエンコードスキームからの数を、別のエンコードスキームからの数と比較する場合には、数は、比較が行われ得る前に、もう一方のエンコード方法に典型的に変換され得る。
【００１２】
２つの異なる包括的なビット構造を比較するための最も自然な方法は、左から右のビットに関する（ｂｉｔｗｉｓｅ）比較手法である。ビット「０」は常にビット「１」よりも小さい。２つのビットアレイＡおよびＢを比較するために、Ａの最も左のビット（Ａ（０）と表記される）は、Ｂの最も左のビット（Ｂ（０）と表記される）と比較される。Ａ（０）＜Ｂ（０）の場合には、ＡはＢよりも小さい。Ａ（０）＞Ｂ（０）の場合には、ＡはＢよりも大きい。しかしながら、Ａ（０）＝Ｂ（０）の場合には、最も左のビットの隣のビット（各々Ａ（１）およびＢ（１）と表記される）が、チェックされる。ストラテジは、ペアごとのビットの値が異なると見出されるまで、Ａ（ｉ）とＢ（ｉ）との比較を連続的に繰り返す。インデックスｉに対するループの間、差異が見出される前に、ＡまたはＢのいずれかが、ビットを使い果たす場合には、初めにビットを使い果たしたアレイがもう一方よりもデフォルトで「小さい」とする。言い換えれば、全てのペアごとのビットが等しいと見出された場合には、より短いアレイが、より長いアレイよりも「小さい」。
【００１３】
ビットアレイを比較するための上記のアルゴリズムは、効果的な速度最適化のために典型的に現代のマイクロプロセッサにハードコードされる。不幸なことには、アルゴリズムは、たいていのエンコードされた数（特に浮動小数点数）の対応するバイトアレイと比較するために使用され得ない。有名な浮動小数点エンコード方法における最も左の符号（Ｓ）ビットは負の数に対して「１」であり、他の全てに対して「０」であることが理由である。それらを数字的に整列させる場合には、負の数は常に正の数よりも前に来るが、数字的な慣習により「１」というビットの値は「０」というビットの値の後に来るので、論理的矛盾が発生する。符号ビットを単純に入れ替えることだけでは十分ではない。例えば、整数２は、典型的に、２の補数を使う方法を用いると００００００１０とコードされる。次いで−２は、１１１１１１１０になる。これら２つの数のビットごとの順序は、数−２が数２よりも小さいにもかかわらず、明確に００００００１０の後に１１１１１１１０を置く。問題は、正の数に制約した場合にも残る。２進数の値が０００００００１  ００００００００である２５６を考える。００００００１０である数２をビットに関して比較する場合には、２５６における第１のバイトは２における第１のバイトよりも小さい。
【００１４】
代わりに、現代のマイクロプロセッサは、２つの８バイトの「倍」精度ＩＥＥＥ７５４浮動小数点数を比較する命令を含む。命令は、比較が行われ得る前に各々の数の全ての８バイトを先取りしなければならない。４バイトの浮動小数点比較命令が存在しない場合には、次いで４バイトの「単」精度ＩＥＥＥ７５４浮動小数点数は、比較が行われ得る前に、８バイトのエンコードに変換されなければならない。共通の整数において、マイクロプロセッサは、１バイト、２バイト、４バイトおよび８バイトの、符号化された整数の比較および符号化されない整数の比較のために特に調節された他の命令を定義する。これらの数のエンコードフォーマット全てを比較し得るフリーサイズの（ｏｎｅ−ｓｉｚｅ−ｆｉｔｓ−ａｌｌ）単一のアルゴリズムは、存在しない。
【発明の開示】
【課題を解決するための手段】
【００１５】
（発明の概要）
一実施形態において、本発明は、浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、浮動小数点数を提供することと、２進数の文字列の左から右の比較が浮動小数点数の相対的な大きさを決定するように浮動小数点数を２進数の文字列にエンコードすることとを含む。
【００１６】
別の実施形態において、本発明は、浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、浮動小数点数を提供することと、浮動小数点数を浮動小数点数の仮数および指数の関数としての長さを有する２進数の文字列にエンコードすることとを含む。
【００１７】
別の実施形態において、本発明は、浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、浮動小数点数を提供することと、浮動小数点数を２進数の文字列にエンコードすることとを含み、２進数の文字列の各々のバイトの一部は、２進数の文字列において別のバイトが続くかどうかを決定する。
【００１８】
別の実施形態において、本発明は、浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、浮動小数点数を提供することと、浮動小数点数を２進数の文字列にエンコードすることとを含み、エンコード処理は全ての浮動小数点数と共に動作する。
【００１９】
別の実施形態において、本発明は、その中に具体化されたコンピュータ読み取り可能なプログラムコードを有するプログラム可能なコンピュータプロセッサと共に使用可能なコンピュータプログラム製品であって、コンピュータ読み取り可能なプログラムコードを含み、該プログラムコードは、２進数の文字列の左から右の比較が浮動小数点数の相対的な大きさを決定するように浮動小数点数を２進数の文字列にエンコードする。
【００２０】
別の実施形態において、本発明は、浮動小数点数をエンコードするためのコンピュータシステムであって、浮動小数点数を提供するための手段と、２進数の文字列の左から右の比較が、浮動小数点数の相対的な大きさを決定するように浮動小数点数を２進数の文字列にエンコードするための手段とを備える。
【発明を実施するための最良の形態】
【００２１】
（図面の詳細な記載）
本発明は、図面を参照することによって、以下の記載における１つ以上の実施形態に記載され、図面において、同様の数は、同一または類似の要素を表す。本発明は、本発明の目的の達成のための最良の形態について記載されるが、本発明は、添付する特許請求の範囲および以下の開示および図面によりサポートされるその同等物により定義される本発明の精神および範囲内に含まれ得る、代替案、変更案および同等案を対象とするように意図されることが当業者によって認識される。
【００２２】
本発明は、２つのビットアレイの、それらが対応する数値の自然な順序との、自然な左から右へのビットごとの比較が、論理的におよび持続的に写像するように、ビットのアレイへ、およびビットのアレイから浮動小数点数をエンコードおよびデコードするコンピュータにインプリメントされる方法である。例えば、２つの任意の浮動小数点数Ｆ１およびＦ２を仮定すると、本発明は、Ａ１＜Ａ２である場合に限り、Ｆ１＜Ｆ２となるように、各々の数を１つずつ、各々ビットアレイＡ１およびＡ２上に写像する。
【００２３】
本浮動小数をエンコードする方法は、デジタルコンピュータにおいて数を記憶することおよび数を操作することにおいて特に有用である。エンコードする方法は、浮動小数点数を記憶することおよび算出することに関連する多くのアプリケーション（例えば、数例を挙げると、金融、自動車、航空および産業統制）において有用である。現実には、浮動小数点数は、コンピュータが、任意の産業用アプリケーション、ビジネスアプリケーションおよび個人用アプリケーションのために数を計算するいかなる場所においても実質的に使用される。方法論はソフトウェアにおいて、または多くのデジタルコンピュータのハードウェアコンポーネント内で行われ得る。
【００２４】
種々の局面において、本発明は、浮動小数点数を２進数の文字列にエンコードすることに関連するコンピュータにインプリメントされる方法である。２進数の文字列の左から右への比較は、浮動小数点数の相対的な大きさを決定する。本発明はまた、浮動小数点数を、浮動小数点数の仮数（ｍａｎｔｉｓｓａ）および指数の関数として長さを有する２進数の文字列にエンコードするコンピュータにインプリメントされる方法である。本発明はまた、浮動小数点数を２進数の文字列にエンコードするコンピュータにインプリメントされる方法であり、２進数の文字列の各々のバイトの一部分が、２進数の文字列において別のバイトが続くかどうかを決定する。本発明はまた、浮動小数点数を２進数の文字列にエンコードするコンピュータにインプリメントされる方法であり、エンコード処理は全ての浮動小数点数によって動作する。
【００２５】
あるいは、本発明は、浮動小数点数をエンコードするために必要とされるビットの数が、数をエンコードするために必要な指数のビットの数まで、変化し、大きくなり得るように、任意の浮動小数点数を、ビットのアレイへ、およびビットのアレイから写像する方法であり得る。本発明はまた、浮動小数点数をエンコードするために必要とされるビットの数が、数を正確にエンコードするために必要な仮数のビットの数まで、または任意の近似精度のレベルまで変化し得および大きくなり得るように、任意の浮動小数点数を、ビットのアレイへ、およびビットのアレイから写像する方法としてみなされ得る。本発明はまた、浮動小数点数をエンコードするために必要とされるビットの数が、より頻繁に使用される数にとっては少なく、それほど頻繁に使用されない数にとっては多くなるように任意の浮動小数点数を、ビットのアレイへ、およびビットのアレイから写像する方法としてみなされ得る。
【００２６】
導入の定義および制約として、「全単写像」は「１対１および上への」という関数であると定義されることを仮定する。すなわち、ＭがセットＡとセットＢとの間の写像である場合には、Ａ内の全てのａに対し、Ｂ内にただ１つの対応するｂがあり、Ｂ内の全てのｂに対して、Ａ内にただ１つの対応するａがある。従って、セットＡおよびセットＢは、同数の要素を有さなければならない。「浮動小数点数」は、「整数部」と呼ばれる整数に、小数点が続き、「小数部」と呼ばれる整数が続く整数に相当するものとして定義される。言い換えれば、浮動小数点数は「整数部．小数部」というフォーマットである。用語「Ｆ１＜Ｆ２」は、Ｆ１がＦ２未満であると考えられる場合に、２つの任意の浮動小数点数Ｆ１およびＦ２を比較することであると定義され、これは、（整数部（Ｆ１）＜整数部（Ｆ２））または（整数部（Ｆ１）＝整数部（Ｆ２））かつ（小数部（Ｆ１）＜小数部（Ｆ２））である場合に限って真である。言い換えれば、Ｆ１の整数部分がＦ２の整数部分未満であれば、Ｆ１＜Ｆ２であり、逆も同様である。Ｆ１の整数部分がＦ２の整数部分と等しいが、Ｆ１の小数部分がＦ２の小数部分未満であれば、Ｆ１＜Ｆ２であり、逆も同様である。「Ｆ１＞Ｆ２」は、Ｆ１がＦ２よりも大きいと考えられる場合に、２つの任意の浮動小数点数Ｆ１およびＦ２を比較することであると定義され、これは、Ｆ２＜Ｆ１の場合に限って真である。「Ｆ１＝Ｆ２」は、Ｆ１がＦ２と等しいと考えられる場合に、２つの任意の浮動小数点数Ｆ１およびＦ２を比較することであると定義され、Ｆ１＜Ｆ２が偽でありＦ１＞Ｆ２が偽である場合に限ってＦ１はＦ２に等しいと言われる。
【００２７】
「ビットパターン」は、ゼロ、１、文字およびスペースからなる文字列であるとさらに定義する。例えば、「ＳＺ１１ＥＥＥ１  ＥＥＥＭＭＭＭ０」はビットパターンである。ビットパターンＢの「頭部」は、最も左のビットであると定義する。ビットバターンＢの「尾部」は、ビットパターンＢの最も左のビットが除去された全てのＢからなるビットパターンであると定義する。ビット「０」は、ビット「１」よりも小さいと定義する。「Ｂ１＜Ｂ２」は、Ｂ１がＢ２未満であると考えられる場合に、２つの任意のビットパターンＢ１およびＢ２を比較することであると定義する。この文は、Ｂ１がビットを有さず、Ｂ２がビットを有する場合と、そうでなければＢ１の頭部がＢ２の頭部未満である場合と、そうでなければＢ１の尾部がＢ２の尾部未満である場合とにおいては、真である。２つの任意のビットパターンＢ１およびＢ２に対し、Ｂ１＜Ｂ２、Ｂ２＜Ｂ１のどちらでもない場合にはＢ１＝Ｂ２である。
【００２８】
「ビットＢの補数」は、Ｂが「０」である場合には「１」、Ｂが「１」である場合には「０」であるとさらに定義する。「ビットパターンの補数」とはパターン内の全てのビットの補数であると定義する。「ビットパターンにサフィックスすること」は、ビットパターンを添えること、すなわちビットパターンの尾部（または右側）に添付することに相当することとして定義する。「１１１」を「０００」にサフィックスすると、結果として「０００１１１」を生じる。「ビットパターンにプリフィックスすること」は、ビットパターンをプリペンディングすること、すなわちビットパターンの頭部（または左側）に添付することに相当するものとして定義する。「１１１」を「０００」にプリフィックスすると、結果として「１１１０００」を生じる。「Ｓ」ビットは、エンコードの第１のビットであると定義し、全体の数の符号を表す。「Ｚ」ビットは、エンコードにおける次のビットであると定義し、指数の符号を表す。「Ｅ」ビットは、指数のビットを表すと定義する。「Ｍ」ビットは、仮数のビットを表すと定義する。「Ｘ」ビットは、全ての８番目のビットにおいて発生する、次のバイトがエンコードするまたはエンコードしない浮動小数点の一部であるかどうかを表示する拡大ビットを表すと定義する
１つの目標は、以下の制約が真であり続けるように任意の浮動小数点数をビットパターンにエンコードすることである。エンコードの方法は、全ての浮動小数点数Ｆのセットとエンコードのセットとの間の全単写像であり、これは全てのビットパターンのサブセットである。ビットパターンＢの全ての適切なエンコードは、ただ１つの浮動小数点数に対応する。全ての浮動小数点数はただ１つのビットパターンのエンコードに対応する。各々の固有の浮動小数点数は固有の２進数の文字列にエンコードする。それぞれがビットパターンＢ１およびＢ２にエンコードされる２つの任意の浮動小数点数Ｆ１およびＦ２の全てに対し、Ｂ１＜Ｂ２の場合に限り、Ｆ１＜Ｆ２である。言い換えれば、対応するビットパターンＢ１〜Ｂｎに写像される順序付けられた浮動小数点数Ｆ１〜Ｆｎの表を作ることによって、ビットパターンＢ１〜Ｂｎもまた順序付けられる。
【００２９】
図面を参照して、図１は、５つの公知の浮動小数点エンコード方法と本発明のエンコード方法との比較である。表１０は、列１２に記載される新規の浮動小数点エンコード方法と共に、単精度、倍精度、拡張型、４倍精度およびブルックシェア（Ｂｒｏｏｋｓｈｅａｒ）エンコード方法を示す。「総ビット」と題された行は、エンコード方法が各々３２ビット、６４ビット、８０ビット、１２８ビットおよび８ビットを使用するのに対して、本エンコード方法は任意の８ビットの倍数を使用するという比較を示している。本方法のみがエンコード処理に用いられるビットの数を変化させ得る。「指数のビット」と題された行は、指数をモデル化するために用意されるビットの数を示す。「最小の指数」および「最大の指数」と題された行は、指数のビットの範囲を計算する。「仮数のビット」と題された行は、浮動小数点の仮数のビットをエンコードするために用意されたビットの数を示しており、すなわち有効な「精度」ビットである。「最小の正の値」および「最大の正の値」と題された行は、浮動小数点数全体の対応する範囲を示している。
【００３０】
１２８ビット（または１６バイト）の「４倍精度」方法は存在するが、典型的には個人的な、または小さなビジネス用のコンピュータには見られない。ブルックシェアの８ビット浮動小数点表現は、情報科学の生徒に浮動小数点数を説明および教示するために用いられる。これらの比較方法（本方法を除く）の全ては、ビットが、１個の符号ビット、続いて定数の指数ビット、続いて定数の精度ビットを有するという点で類似している。「０」という符号ビットは、負でない数を示している。
【００３１】
図２の表２０は、実在するエンコード方法がビット位置に対する翻訳をどのように指定するかを示している。「エンコード方法」と題された第１の行は、比較のために用いられる現代の浮動小数点エンコード方法に対して共通の名前を含む。「バイトカウント」と題された第２の行は、各々のエンコード方法が使用する固定のバイトがいくつあるかを示している。「ビットフォーマット」と題された第３の行は、各々のバイト内の各々のビットがどのように用いられるかを示している。最も左のビットは符号（Ｓ）ビットである。次の一連のビットは指数（Ｅ）ビットである。残りの右のビットは仮数（Ｍ）ビットである。ビットは８つでグループ化され、スペースにより隔てられる。
【００３２】
図３の表３０は、例示的なバイトアレイが浮動小数点数を表すようにどのように翻訳されるかを示している。各々の列は、例を示している。「行」と題された第１の列は、単に例示的な行を列挙している。「１６進数のバイト」と題された第２の行は、スペースにより隔てられた各々のバイトの１６進数の値を与える。ヘッダは、以下のデータ行においてバイトを列挙することを視覚的に助けるために「００  ０１  ０２  ０３」を含む。バイトおよびビットは、００で開始して左から右へ列挙される。例えば、行３のバイト０１の値は「Ｃ０」である。各々のバイトは、２つの１６進数のディジットを有する。１６個の１６進数のディジットは、「０１２３４５６７８９ＡＢＣＤＥＦ」である。１６の組み合わせを表すために４つのビットを用いるので、およびバイトが８ビットを有するので、２個の１６進数のディジットが１個のバイトをエンコードすることが必要とされる。「対応するビット」と題された第３の列は、第２の列の２進数での相当値を示す。ビットは８個でグループ化され、スペースにより隔てられる。さらに、ビットの列挙はヘッダ内に示される。例えば、行３のビット１１は「１」であり、行３のビット１２は「０」である。「対応するＩＥＥＥ７５４数値」と題された第４の列は、ビット値のエンコードにおいて相当するＩＥＥＥ７５４浮動小数点の翻訳を示す。
【００３３】
図４において、表４０は本浮動小数点エンコード方法を図示する。最初の８バイトに対するエンコードパターンのみが示されていることに注意する。さらなる指数ビット、または仮数ビットを追加するための公式は表４０から得られる。「行」と題された第１の列は、例示的な列を列挙する。「Ｅ」と題された第２の列は、パターン内の指数（Ｅ）ビットの数を示している。「Ｍ」と題された第３の列は、パターン内の仮数（Ｍ）ビットの数を示している。「ＭＡＸ  ＥＸＰ」と題された第４の列は、指数ビットがモデル化され得る１０進数の値の絶対値を示している。「ＤＩＧＩＴＳ」と題された第５の列は、パターンがモデル化され得る有効な１０進数のディジットの近似的な数を示している。「ＢＹＴＥ  ０」、「ＢＹＴＥ  １」などと題された残りの列は、各々のキャラクタがどのようにして対応するビットが翻訳されるかを記載する実際のビットパターンを示している。
【００３４】
翻訳キャラクタは、「Ｓ」、「Ｚ」、「Ｅ」、「Ｍ」、「０」および「１」である。Ｓは符号ビットであり、ここで０は浮動小数点値が負であることを意味し、以下の全てのビットは即座に否定される。Ｚは指数の符号であり、ここで０は指数値が負であることを意味し、１は指数値が正である場合を意味する。Ｅは実際の正の指数値である。パターン内の全てのＥビットが１にセットされる場合には、そのパターンは使用されず、次の列内のパターンが試される。Ｍは実際の負の仮数のビットである。「０」はパターンを終結させる拡大ビットの値を表す。０の場合には、続くバイトはパターンの一部ではない。「１」はパターンを連続する拡張ビット値を表す。１の場合には、次のバイトはパターンの一部である。
【００３５】
種々のエンコードの例が与えられる前に、パターンの「指数の調整」は、指数ビットの数Ｎから整数への写像であると定義する。このインプリメンテーションに対し、セット｛２，６，１２，２８，など｝のメンバーとなるようにＮを選択する。このセットは、プロセッサ最適化判定基準に基づいて選択されるが、１より大きい第１の要素から開始する整数の任意のセットであり得、ここで各々の後継の要素は２以上のステップごとに増加する。指数の調整の写像は次いで関係式のセット｛（２，０），（６，３），（１２，６６），（２８，４１６１），．．．，（Ｎ，ＥＡ）｝になり、ここでＥＡは、２＾（前のＮ）＋（前のＥＡ）−１である。例えば、収録要素（２８，４１６１）は、２＾１２＋６６−１＝４０９６＋６６−１＝４１６１であるように決定される。
【００３６】
０．００という浮動小数点の値をエンコードするために、ビットパターン「１０００００００」が公理（ａｘｉｏｍ）として使用される。「１０００００００」は上記のパターンルールを適用せずに０を意味する。このような共通の有名な値（０のような）が、エンコードするためにメモリの１バイトのみを要するべきであることは有利であり、他の比較方法については偽である。１．０００という浮動小数２進数の値をエンコードするために、数は２進数の科学的記数法に変換され、１ｅ０を与える。すなわち、１に１０の０乗を掛ける。有効なディジットを規格化するために、最も左の「１」ディジットは落とされ、「０」という仮数を与える。指数は「０」である。必要とされる最も短いビットパターンは２つの指数のビットを有し、少なくとも１つのＭビットおよび少なくとも１つのＥビットを有するパターンにおいて「０」を得るために、指数から「０」という指数の調整を抽出する。図４の列１からの「ＳＺＥＥＭＭＭ０」のビットパターンは、これらの判定基準に合う第１のパターンである。このパターンに対する「０」という仮数のプラギングは、「ＳＺＥＥ００００」である。「０」という指数のプラギングは、「ＳＺ００００００」である。指数が負でないので、Ｚは「１」にセットされ、これは「Ｓ１００００００」である。最後に、全体の数の符号は負ではなく、そのためＳは「１」にセットされ、これは「１１００００００」である。
【００３７】
表４０は、本浮動小数点数エンコード方法論を説明することに有用である。Ｆを浮動小数点数とする。２進数では「１００１．１」である、Ｆ＝−９．５をエンコードするために、数は２進数の科学的記数法に変換され、それは「１．００１１ｅ１１」である。有効なディジットは「１００１１」である。最も左のビットを落とすと、規格化される仮数は「００１１」になる。指数のビットは「１１」である。指数のパターンは、その時全てのＥビットは「１」であるので、「ＳＺＥＥＭＭ．．．」パターンにフィットしない。これはさらなる指数Ｅビットを有する続くパターンを示す指数マーカビットパターンである。次の判断は、６個のＥビットを含む、「ＳＺ１１ＥＥＥ１  ＥＥＥＭＭ．．．」であるので、「０」を与えるために我々の現在の指数値から３という指数の調整を抽出する。エンコードするために４個の仮数ビットが存在するので、図４からの第１のパターンは、行９において浮動小数点数を十分にモデル化し得る。すなわち「ＳＺ１１ＥＥＥ１  ＥＥＥＭＭＭＭ０」である。「００１１」という仮数ビットにおけるプラギングは「ＳＺ１１ＥＥＥ１ＥＥＥ００１１０」である。「０」という指数のビットにおけるプラギングは、「ＳＺ１１０００１０００００１１０」である。指数が負でなく、そのためＺは、「Ｓ１１１０００１  ０００００１１０」を与えるために「１」にセットされる。しかし、−９．５は負であり、そのためＳは「０」にセットされ、全ての他のビット値が、２進数で「０Ｅ  Ｆ９」である「００００１１１０  １１１１１００１」を与えることが否定される。
【００３８】
図５におけるフローチャート５０はまた、同じ数−９．５をエンコードするために使用され得る。ステップ１００（すなわちＥＮＣＯＤＥ（−９．５））から開始すると、ステップ１０２においてＦは０ではないので、ステップ１０６に移動する。ステップ１０６においてＦは０未満なので、ステップ１０８に移動する。第１のＥＮＣＯＤＥ（−Ｆ）はＥＮＣＯＤＥ（９．５）を意味し、次いでビットの補数をとる。ステップ１０８は、実際にはフローチャートに対する帰納的コールである。ＥＮＣＯＤＥ（９．５）のために、ステップ１００から再び開始すると、これまでのステップ１０２および１０６からステップ１１２へと移動する。Ｂ＝「１」から開始する。Ｎ＝２を選び取り、Ｆを１．００１１ｅ１１と表現すると、Ｍ＝「００１１」およびＥ＝「１１」、およびＸ＝「１１」が与えられる。ステップ１１４において、Ｘ（Ｘ＝３である）は、２＾Ｎ−２（２＾Ｎ−２＝２である）よりも大きい。そこでステップ１１６に移動する。Ｂ（Ｂ＝「１」である）を２＾Ｎ−１（３であり、すなわち２進法で「１１」である）でサフィックスする。Ｂは「１１１」になる。Ｘ（Ｘは３である）から２＾Ｎ−１（これは３である）を引く。Ｘは０になる。最後に、随意的にＮ（Ｎは２である）を４ごと増加させる。ここでＮは６になる。ステップ１１４に戻って、Ｘ（Ｘは０である）はもはや２＾Ｎ−２（２＾６−２であり、それは６２である）よりも大きくない。そこでステップ１１８に移動し、その左のパッドＸ（Ｘは「０」である）は、ビットの長さがＮになるまで「０」を有する（Ｎは６である）。そこでＸは「００００００」になる。ステップ１２０はＸを付加し、Ｂに対しては「００００００」で、Ｂは「１１１」である。そこでＢは「１１１００００００」になる。
【００３９】
ステップ１２２において、Ｅは３であり、０未満ではない。そこでステップ１２６をスキップする。Ｂは「１」でプリフィックスされ、Ｍでサフィックスされる。Ｂは「１」＋「１１１００００００」＋「００１１」または「１１１１００００００００１１」である。ステップ１２８は、全ての８番目のビットの前に拡張ビット「１」を挿入する。そこでＢは、「１１１１０００１  ０００００１１」になる。ステップ１３０はＢの右に「０」をパッディングし（ｒｉｇｈｔ−ｐａｄ）バイトのグループ化（すなわち８ビットの偶数倍）にフィットさせる。Ｂは「１１１１０００１  ０００００１１０」になり、これは、９．５のビットエンコードにおける１６進数のエンコードの「Ｆ１  ０６」である。ステップ１３２は、ステップ１１０に対するステップ１０８の帰納的コールに戻り、−９．５のエンコードを得るためにＢの補数をとる。「Ｆ１  ０６」の補数は、「０Ｅ  Ｆ９」であり、補数は図４に示されている表４０が使用される上記の例と同一である。
【００４０】
図４に示される表４０のパターンは、任意の浮動小数点数を適応するために拡張され得る。行２２におけるパターンは「ＳＺ１１１１１１  １１１１１１１１  １１１１１１１１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＭＭＭＭＭＭＭ０」である。このパターンは、２８個の指数のビットおよび７個の仮数ビットを有する。さらなる指数のビットが必要とされる場合には、これらを拡張するための方法は、第１に全ての存在する「Ｅ」ビットを「１」で交換し、次いで「ＥＥＥＥＥＥＥ１」パターンの数を２倍することである。それを行うことにより「ＳＺ１１１１１１  １１１１１１１１  １１１１１１１１  １１１１１１１１  １１１１１１１１  １１１１１１１１  １１１１１１１１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＥＥＥＥＥＥＥ１  ＭＭＭＭＭＭＭ０」が与えられ、５６個の拡張ビットが生成される。さらなる仮数ビットが必要とされる場合には、各々のバイトにおいて最も右の拡大ビットを適切に変更する一方で、単に１つ以上の「ＭＭＭＭＭＭＭ１」パターンを付加する。例えば、図４中の行９におけるパターンは、この方法により拡張され行１０〜１５を与える。付加された各々の仮数「ＭＭＭＭＭＭＭ１」バイトに対し、ほぼ２．１という有効な１０進数のディジットが数の精度に追加される。１バイトごとに１ビットが拡大ビットとして割り当てられているので、１バイトごとに７個のビットのみが数値データをモデル化する。８バイトのＩＥＥＥ７５４の倍精度浮動小数点エンコードにおいて記憶される乱数は本エンコード方法の９バイトを要する。
【００４１】
図５において、Ｆ＝０をエンコードするために、「１」に７個の「０」が続く値を有するビットパターン「１０００００００」を用いる。負の浮動小数点数ＦをビットパターンＢにエンコードするために、ビットパターンＢを生成するためにその絶対値をエンコードし、次いでＢをＢの補数になるようにする。
【００４２】
浮動小数点数１３．７５をエンコードする以下のさらなる例を考える。浮動小数点数は整数部分として「１３」、小数部分として「７５」を有する。図５において、整数１３は正であるので、ステップ１１２はＢ＝「１」から開始される。Ｎ＝２とし、これは１よりも大きい任意の数である。アルゴリズム全体を通じて、数Ｎは指数を記憶するように分配されたビットの数を表す。２進数の形式において１３．７５を表現するために、１３をその２進数に相当する「１１０１」で置換し、．７５をその２進数に相当する「．１１」で置換する結果として「１１０１．１１」が生じる。２進数における「．１」は１０進数における０．５に等しく、２進数の「０．０１」は１０進数の「０．２５」に等しいことに注意する（０．５＋０．２５＝０．７５）。次いで、「１１０１．１１」を指数表記に変換する（すなわちＡ＊２＾Ｂという形式で）。Ａは、「有効数（ｓｉｇｎｉｆｉｃａｎｄ）」と呼ばれる２進数の浮動小数点数であり、以下の２つの値の内の１つであり得る。（１）０、または（２）１以上２未満。Ｂは整数の指数である。Ａ＊２＾Ｂはしばしば、ＡｅＢと表記され、ここで「ｅ」は「指数」を意味するトークンである。そこで「１１０１．１１」は指数表記において「１．１０１１１ｅ１１」と表記され、ここで「１．１０１１１」は有効数であり、「１１」は指数であって、一つの「１」ディジットのみが小数点の位置の左に来るように、単に小数点を３個分（すなわち「１１」の位置）左に移動するものである。有効数は規格化される。有効数が左に３つ移動されるので、指数は３である（または２進数で「１１」である）。有効数を右へ移動させるという要求があった場合には、指数は負である。そこで「１．１０１１１」に２の３乗（これは８である）を掛け、もとの数「１０１１．１１」が得られる。ＸをＥの絶対値とし、その値は３である。
【００４３】
ステップ１１４において、指数は「１１」（これは３である）であり、２＾Ｎ−２（これは２＾２−２であり、２となる）よりも大きい。そこでステップ１１６に進む。サフィックスＢは１であり、「１」をＮ回（これは２回である）くり返される。Ｎは２であるので、Ｂは「１１」によりサフィックスされる。Ｂはここで「１１１」になる。Ｘ（これは「１１」であり、３である）から２＾Ｎ−１（これは２＾２−１であり、３である）を引く。Ｘはここで０になる。随意的に、任意の非負整数ごとＮを増加させる。本明細書のインプリメンテーションに従って、Ｎは、Ｎが６になるように４ごと増加する。ステップ１１４に戻ると、Ｘは０であり、２＾Ｎ−２以上（これは６２である）ではない。Ｘ（これは０である）は、Ｎビットを有するまで「０」をプリフィックスされ、これは６ビットである。このときＸは「００００００」である。
【００４４】
ステップ１２０においてＢ（これは「１１１」である）は、Ｘ（これは「００００００」である）をサフィックスされる。このときＢは「１１１００００００」である。ステップ１２２においてＥは０未満ではなく、そこでステップ１２６に進む。仮数は有効数において小数点に続く全てのディジットである。有効数は「１．１０１１１」であり、仮数は「１０１１１」である。この意味では、プリフィックス「１．」は有効数から落とされる。０を除くことにより、数に対して全ての規格化された有効数は「１．」によりプリフィックスされる。Ｂ（これは「１１１００００００」である）に「１」をプリペンド（ｐｒｅｐｅｎｄ）する。Ｂはこのとき「１１１１００００００」である。「１０１１１」であるＭによってＢをサフィックスする。Ｂは「１１１１００００００１０１１１」になる。ステップ１２８において、全ての８番目のビットの前に「１」を挿入する。Ｂは「１１１１０００１０００１０１１１１」になる。ステップ１３０において、パターン内のビットの数が８の倍数になるまで、０またはさらなる「０」によってビットパターンをサフィックスする。この場合Ｂは、「１１１１０００１００００１０１１１１」となり１７ビットを有し、これは８の倍数ではない。そこで、ビットの数を８の倍数である２４まで増加させるために、Ｂに７個の「０」を添付する。Ｂは「１１１１０００１  ０００１０１１１  １００００００００」になり、１６進数では「Ｆ１  １７  ８０」である。
【００４５】
上記の変換プロセスから、２進数の文字列の長さは浮動小数点数の仮数および指数の関数の一部であることに注意する。浮動小数点数の仮数の値と指数の値は、２進数の文字列の最大の長さを部分的に決定する。
【００４６】
本浮動小数点から２進数への変換プロセスの別の特性は、２進数の文字列の各バイトが別のバイトが続くかを決定することである。通常のルールは、各バイトの最後のビットが最初のバイトの最初のビットの値である場合には、別のバイトが続くことである。逆に、各バイトの最後のビットが最初のバイトの最初のビットの値でない場合には、さらに続くバイトはない。正の数に対して、バイトが「１」で終わる場合には、２進数の文字列の別のバイトが続く。バイトが「０」で終わる場合には、さらに続くバイトはない。例えば、浮動小数点数１３．７５からの２進数の文字列「１１１１０００１  ０００１０１１１  １０００００００」において、最初のバイトは「１」で終わり、別のバイトが続く。第２のバイトは「１」で終わり、別のバイトが続く。第３のバイトは「０」で終わり、さらに続くバイトはない。この特性は、算出アルゴリズムに２進数の文字列の終わりを決定させる。
【００４７】
整数として「１３」を、小数として「７５」を有する浮動小数点数−１３．７５をエンコードする別の例を考える。−１３．７５をエンコードするために、その正の値１３．７５をエンコードし、次いで結果のビットパターンをネゲート（ｎｅｇａｔｅ）する。Ｂは「００００１１１０  １１１０１０００  ０１１１１１１１」になり、１６進数では「０Ｅ  Ｅ８  ７Ｆ」になる。
【００４８】
浮動小数点数−２５．１をエンコードする、さらに別の縮約された例を考慮する。−２５．１のエンコードは、２５．１のエンコードの補数をとることと同一である。ステップ１１２から、Ｂ＝「１」およびＮ＝２で開始する。２５．１は２進数で「１１００１．０００１１００」であって、終結部のパターン「１１００」を無限に繰り返す。それゆえに、このビットパターンを切断するための仮数のビットの数は、エンコードする前に外部から決定されるべきである。目標が８バイトＩＥＥＥ７５４倍精度エンコードと同じ精度を維持するために、図１に従って、５３個の仮数ビットが必要とされる。２進数の値は、「１１００１．０００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１」まで拡張されるべきである。指数形式は「１．１００１０００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１ｅ１００」である。それゆえに、仮数は「１００１０００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１００  １１」で、指数は「１００」である。そこでＸは「１００」である。Ｂが「１１１」になるようにステップ１１６からＢに「１１」をサフィックスし、「１」を得るためにＸから３を引き、Ｎを２から６まで増加させ、ステップ１１４に進む。ステップ１１８において、Ｘは「０００００１」を得るためにパッドされ、Ｂは「１１１０００００１」になる。ステップ１２６はＢ＝「１１１１０００  ００１１００１  ０００１１００  １１００１１０  ０１１００１１  ００１１００１  １００１１００  １１００１１０  ０１１００１１」であり、ここでビットは、視覚的な便宜のために７ビットのグループで、スペースにより制限されている。ステップ１２８は、全ての７個のビットのグループに８番目のビット「１」を追加する。「１１１１０００１  ００１１００１１  ０００１１００１  １１００１１０１  ０１１００１１１  ００１１００１１  １００１１００１  １１００１１０１  ０１１００１１」となる。ステップ１３０において、Ｂは７１個のビットのみを有し、しかし７２がちょうど次の８の倍数である。そこで、Ｂのビットを８ビットのバイトにグループさせるために「０」をＢに付加する。Ｂは「１１１１０００１  ００１１００１１  ０００１１００１  １１００１１０１  ０１１００１１１  ００１１００１１  １００１１００１  １１００１１０１  ０１１００１１０」になり、これは２５．１のエンコードである。−２５．１のエンコードを得るために、Ｂの補数をとる。Ｂは「００００１１１０  １１００１１００  １１１００１１０  ００１１００１０  １００１１０００  １１００１１００  ０１１００１１０  ００１１００１０  １００１１００１」であり、「０Ｅ  ＣＣ  Ｅ６  ３２  ９８  ＣＣ  ６６  ３２  ９９」に相当する。
【００４９】
数１０００＝「１１１１１０１０００」＝「１．１１１１０１０００ｅ１００１」をエンコードするさらに縮約された例において、指数＝１００１であり、仮数＝１１１１０１０００である。ステップ１１４に従って、指数は大きすぎてフィットできない。そこでＢに「１１」をサフィックスして、指数から３を引くと、Ｂは「１１０」になり６つのキャラクタがパッドされるように付加される。Ｂは「１１１０００１１０」になる。ステップ１２０においては、Ｂは「１１１１０００  １１０１１１１  ０１０００」を得るようになる。全ての８番目のビットに「１」を挿入し、バイトにおける残りのビットをパッドするために「０」を付加する。Ｂは「１１１１０００１  １１０１１１１１  ０１００００００」になり、これは「Ｆ１  ＤＦ  ４０」である。
【００５０】
数４，２９４，９６７，２９６＝２＾３２＝「１００００００００００００００００００００００００００００００００」＝「１ｅ１０００００」をエンコードする例において、指数は、３を引くことによって「１１１０１」に調整される。仮数は「０」である。ビットパターンは「Ｓ」および「Ｚ」ビットに対して「１１」になり、指数の調整のための「１１」が続き、Ｅビットのための「０１１１０１」が続き、仮数のための「０」が続き「１１１１０１１１０１０」になる。Ｘビットを挿入すると「１１１１０１１１  １０１００００」または「Ｆ７  Ａ０」が結果として生じる。
【００５１】
数１８，４４６，７４４，０７３，７０９，５５１，６１６＝２＾６４＝「１」に「０」が６４個続き＝「１ｅ１００００００」をエンコードする例。我々の数の指数は「１００００００」であり、７個のビットを要する。そこで、指数の調整は３であり、これは「１１１１０１」を与えるために「１００００００」から引かれ、６個の「Ｅ」ビットにフィットする。そこでビットパターンは「Ｓ」および「Ｚ」ビットのための「１１」、指数の調整のための「１１」、「Ｅ」ビットのための「１１１１０１」、仮数のための「０」により、結果として「１１１１１１１１０１」を生じる。「Ｘ」ビットを追加した後に、最終のエンコードは「１１１１１１１１  １０１０００００」となり、これは「ＦＦ  Ａ０」である。さらに、２＾６４のような非常に大きいが有用な数は、エンコードするために２バイトのみしか要さない。
【００５２】
図５のフローチャート５０のステップ１２４を用いる例を示すために、負の指数を有する数をエンコードする。例えば、Ｆ＝０．０６２５は、２進数では１．０ｅ−４である。１から開始して、０．５を得るためにこれを２で割る。０．２５を得るために、さらに２で割り、０．１２５を得るためにさらに繰り返し、０．０６２５を得るためにもう一度繰り返す。数は４回割られているので、指数は−４である。従ってＢ＝「１」、Ｍ＝「０」およびＥ＝「−４」であり、Ｘは「１００」である。ステップ１２０によって、Ｂは「１１１０００００１」である。ステップ１２２においては、Ｅは０未満であり、ステップ１２４に進む。「０００１１１１１０」を得るためにＢの補数をとる。ステップ１２６において、Ｂは「１０００１１１１１００」を得るために、「１」＋「０００１１１１１０」＋「０」に変形させる。ステップ１２８はＢを「１０００  １１１１  １１００」に変形させる。ステップ１３０はＢを「１０００  １１１１  １１００  ００００」に変形させ、１６進数では「８０  Ｃ０」である。
【００５３】
いくつかの例が与えられているが、注目する重要な点は、浮動小数点数を２進数の文字列にエンコードする本処理は全ての浮動小数点数と共に機能することである。この特性は他の従来技術のエンコード手法によっては利用可能ではなく、他の従来技術のエンコード方法は、図１に示されるように指数の範囲を制限するか、仮数の範囲を制限するかのどちらかである。例えば、任意の精度のＪａｖａ（登録商標）．Ｍａｔｈ．ＢｉｇＤｅｃｉｍａｌクラスはそのスケーリングの値を３２ビットに制限し、ＧＮＵのマルチプルプレシジョン（ＧＭＰ）ライブラリは、全てのバイト数がメモリにおいて同時に存在することを必要とする。浮動小数点数を２進数の文字列にエンコードする本処理によって、数は、バイトが消費された後に効果的にバイトを処分する単位時間に１バイトのバッファされたストリームとして処理され得る。
【００５４】
本エンコード方法の別の特性は、２進数の文字列の左から右の比較が浮動小数点数の相対的な大きさを決定することである。例えば、浮動小数点数１３．７５は「１１１１０００１  ０００１０１１１  １０００００００」にエンコードされる。浮動小数点数１０００は「１１１１０００１  １１０１１１１１  ０１００００００」にエンコードされる。左から右の比較を行うことにより、最初の８ビットに対して同じ値が生み出されるが、第２のバイトの最初のビットは、浮動小数点数１０００に対して「１」であり、浮動小数点数１３．７５に対して「０」である。それゆえ、１０００は１３．７５よりも大きい。別の例において、５２個の有効な仮数のビットに切断された浮動小数点数−２５．１は、「００００１１１０  １１００１１００  １１１００１１０  ００１１００１０  １００１１０００  １１００１１００  ０１１００１１０  ００１１００１０  １００１１００１」にエンコードされ、浮動小数点数−１３．７５は「００００１１１０  １１１０１０００  ０１１１１１１１」にエンコードされる。左から右の比較は各々のエンコードの最初の１１ビットに対して同じ値が生み出されるが、１２番目のビットは−１３．７５に対して「１」であり、−２５．１に対して「０」である。「１」は「０」よりも大きいので、−１３．７５は−２５．１よりも大きい。従って、２進数の文字列の左から右の比較は浮動小数点数の相対的な大きさを決定する。２進数の文字列が共通部分を識別するが、一方の文字列が他方よりも長い場合には、より長い文字列は、より大きい浮動小数点数に対応し、エンコード方法から推論され得る。全てのエンコードされたバイトの８番目のビットは拡張ビットであるので、例えば、１つのエンコードが２個のバイトを要し、２番目のエンコードが３個のバイトを要する場合には、各々のエンコードの１６番目のビットは、全ての８番目のビットは、それがエンコードにおける最後のバイトか否かを決定する拡張フラグであるので、異なる。２つのエンコードの最初の１５ビットは同一である場合１６番目のビットに「０」を有するエンコードはより小さな数である。
【００５５】
図６は、本エンコード方法を実行する汎用のデジタルコンピュータ６０の簡略図である。コンピュータ６０は、中央処理装置またはマイクロプロセッサ６２、大容量記憶デバイスまたはハードディスク６４、電子メモリ６６および通信ポート６８を有する。一実施形態においては、コンピュータシステム６０は、本エンコード方法論を行うために用いられるハードウェアコンポーネント、アプリケーションソフトウェア、またはコンピュータプログラムを含む。ソフトウェアは、コンパクトディスク（ＣＤ）のようなコンピュータ読み取り可能な媒体上にもともと提供されるか、またはベンダのウェブサイトからダウンロードされ、所望のコンピュータ上にインストールされる。
【００５６】
図７の表７０は、１個のバイトにエンコードされ得る浮動小数点数の適切なビットの値の組み合わせを示している。「ＢＩＮＡＲＹ」と題された列は、正当なビットの値を示している。「ＤＥＣＩＭＡＬ」と題された列は、そのすぐ左のセルの対応する浮動小数点数を示している。２５６個の可能性のある８ビットの順列において、８１個のみが本エンコード方法に対する浮動小数点数の値を有する。これらの値のみが、表５０に示されている。可能な限り多くのビットの数列を固定スペースにパックすることは、本エンコード方法の優先事項ではない。必要とされるバイト数は任意の浮動小数点の値を適応させるように大きくなる。
【００５７】
これらの８１個の値は、ＩＥＥＥ７５４エンコード規格に従って、４または８バイトの代わりに１バイトのみを記憶のために要するのみである。これらの８１個の値は、おそらく間違いなく現在使用される全ての数値の９９．９９％よりも多くを含む。例えば、数８は８ビットのエンコードパターンに現れないけれども、数０〜７は現れる。典型的な家族における子供の数をモデル化する場合には、０〜７の数は、数８よりも８倍多く頻繁に使用される。加えて、８〜３２までに正の整数および負の整数は、エンコードするために２バイトしか要さず、ＩＥＥＥ７５４規格よりもはるかに少ないバイト数である。加えて、本単精度バイトエンコードはまた、有用かつ有名な数（例えば、０．２５、０．５、０．７５ならびに分母が最大３２までの他の有名な整数部分）をもモデル化する。
【００５８】
任意の負の値がその正の値に等しくなるビットに関するネゲートに注意する。例えば、−２．２５は００１０１１０１としてエンコードされる。これらのビットの値が１１０１００１０を与えることをネゲートすると、これは＋２．２５という値に直接写像される。最後に、８１個の数値が、−７．５〜７．５の間に並べられること、ビットエンコードはまた０００１０００１から１１１０１１１０の間に並べられ、これは本エンコード方法を意図的な設計制約であることに注目する。エンコードするビットの値の順序は、対応する数値の順序にマッチするべきで、逆も同様であり、これは最も重要な設計制約である。
【００５９】
図８における表８０は、浮動小数点数と、本エンコード方法による浮動小数点数のエンコードとの例示的な関係性を示している。さらに１０２４の２進数の表現は、−１０２４の２進数の表現のビットごとのネゲートであること注目する。関係性は、全ての数およびそれらの負の数において真である。
【００６０】
図９において、本エンコード方法は、任意の精度およびに任意の日に対する日時を記憶するために使用され得る。表９０において、国際ユリウス日時規格は、浮動小数点数を直接写像し、ここで数は「紀元前４７１３年１月１日」からの日数を表す。小数部分は、正午から経過した１日の部分を表す。単純な日付は記憶するために典型的に約５バイトを要するが、一部は少なく要し得る。例えば、「１８４３年１１月５日」は、２つのバイトのみを要する。年が重要でない場合には、３６５日の各々は１または２バイトとしてエンコードされ得る。共通の時間（例えば、午後６時および午前９時）は、記憶するために１バイトのみを要する。
【００６１】
本発明の１つ以上の実施形態が詳細において図示されているが、当業者はこれらの実施形態に対する変更および適合が、添付する特許請求の範囲において述べられる本発明の範囲から逸脱することなく行われ得ることを認識する。
【図面の簡単な説明】
【００６２】
【図１】図１は、浮動小数点エンコード方法の間の比較を図示している。
【図２】図２は、工業規格の浮動小数点エンコード方法のビットフォーマットを図示している。
【図３】図３は、浮動小数点数と、浮動小数点数の対応する１６進数および２進数のエンコードとの関係性の例を図示している。
【図４】図４は、本エンコード方法に従う、浮動小数点数のビットフォーマットを図示している。
【図５】図５は、浮動小数点数のエンコードの一般的な処理を図示している。
【図６】図６は、浮動小数点数のエンコードの方法を実行するための汎用コンピュータを図示している。
【図７】図７は、浮動小数点数に対する本エンコード方法の単一バイトのエンコードを図示している。
【図８】図８は、浮動小数点数の付加的なエンコードを図示している。
【図９】図９は、浮動小数点数の時間および日付のエンコードを図示している。
【図１】
2008521142.tif 000003
【図２】
2008521142.tif 000004
【図３】
2008521142.tif 000005
【図４】
2008521142.tif 000006
【図５】
2008521142.tif 000007
【図６】
2008521142.tif 000008
【図７】
2008521142.tif 000009
【図８】
2008521142.tif 000010
【図９】
2008521142.tif 000011
【手続補正書】
【提出日】平成19年6月1日(2007.6.1)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
浮動小数点数をエンコードする、コンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を、左から右の２進数の文字列の比較が、該浮動小数点数の相対的な大きさを決定するように、該２進数の文字列にエンコードすることと
を含む、方法。
【請求項２】
請求項１に記載のコンピュータにインプリメントされた方法であって、
前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードすることと、
該浮動小数点数の前記２進数の文字列の補数をとることと
をさらに含む、方法。
【請求項３】
請求項１に記載のコンピュータにインプリメントされた方法であって、前記浮動小数点数が０である場合には、前記２進数の文字列の値を指定することをさらに含む、方法。
【請求項４】
浮動小数点数をエンコードするコンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を、該浮動小数点数の仮数および指数の関数としての長さを有する２進数の文字列にエンコードすることと
を含む、方法。
【請求項５】
請求項４に記載のコンピュータにインプリメントされた方法であって、
前記浮動小数点数が負である場合には、該浮動小数点数の絶対値をエンコードすることと、
該浮動小数点数の前記２進数の文字列の変換の補数をとることと
をさらに含む、方法。
【請求項６】
浮動小数点数をエンコードする、コンピュータにインプリメントされた方法であって、
浮動小数点数を提供することと、
該浮動小数点数を２進数の文字列にエンコードすることと
を含み、
該２進数の文字列の各々のバイトの一部は、該２進数の文字列において別のバイトが続くかどうかを決定する、方法。
【請求項７】
請求項６に記載のコンピュータにインプリメントされた方法であって、前記２進数の文字列の各々のバイトのビットの値は、別のバイトが続くかどうかを決定する、方法。
【請求項８】
請求項６に記載のコンピュータにインプリメントされた方法であって、各々の固有の浮動小数点数は、固有の２進数の文字列にエンコードされる、方法。
【請求項９】
浮動小数点数をエンコードするためのコンピュータシステムであって、
浮動小数点数を提供するための手段と、
浮動小数点数を、文字列の左から右の２進数の比較が、該浮動小数点数の相対的な大きさを決定するように、該２進数の文字列にエンコードするための手段と
を備える、システム。
【請求項１０】
請求項９に記載のコンピュータシステムであって、
前記浮動小数点数が負である場合に、該浮動小数点数の絶対値をエンコードするための手段と、
該浮動小数点数の２進数の文字列の変換の補数をとるための手段と
をさらに含む、システム。
【国際調査報告】
2008521142.tif 000012