(57)【要約】      （修正有）【課題】三角関数の計算のために、入力xのための引数t=x/piを近似するための４要素内積回路（ＤＰ４）を用いる回路を提供する。【解決手段】引数は、SinPi()又はCosPi()のような三角関数に入力される。ＤＰ４回路は、xかけるpiの逆数の表現を計算する。用いられるpiの逆数のビットは、xの指数の大きさに基づいて選択される。ＤＰ４回路は、４つの乗算器１００ａ〜１００ｄ、２つの中間加算器１０２ａ〜１０２ｂ及び最終加算器１０６を含む。乗算器、中間加算器、及び最終加算器の出力は、最終加算器の出力が、三角関数に入力されたとき正確な出力を与えるであろう引数ｔの値となるように、調整される。【選択図】図１
2017199370.tif 000002
【特許請求の範囲】
【請求項１】
（ａ）４個の第１の入力(v1, v2, v3, v4)と、４個の第２の入力(u1, u2, u3, u4)とを受信し、
（ｂ）前記４個の第１の入力と４個の第２の入力を４個の乗算器(Mul1, Mul2, Mul3, 及び Mul4)へ入力し、
（ｃ）乗算器Mul1 及び Mul2の出力を加算器Adder12へ入力し、
（ｄ）乗算器Mul3 及び Mul4の出力を加算器Adder34へ入力し、
（ｅ）Adder12 及び Adder34の出力を加算器AdderAllへ入力し、
（ｆ）AdderAllの出力を出力するように構成された４要素内積回路（Ｄｐ４）と、
1/piとxの表現を前記乗算器Mul1, Mul2, Mul3, Mul4に入力することにより、x/piの概算を計算し、
三角関数回路に対応する三角関数の理論的に正しい値に対する入力引数としてtを受信し、前記入力引数として、Mul1 + Mul2 + Mul3 + Mul4に対する三角回路の出力と比較したとき、入力として、x/piを取る前記三角関数回路の出力の精度を増加するのに効果的なtを計算するために、加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理する、ように構成された前記三角回路と、を備えるシステム。
【請求項２】
前記三角回路は、
【数９】
2017199370.tif 000013
を近似するのに有効なtを計算するために、加算器Adder12, Adder34, 及びAdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理するように更に構成されている、請求項１に記載のシステム。
【請求項３】
前記三角回路は、Fraction_RCP_PI内のFraction_EffectBitsのビット位置がexpXの大きさと共に減少するように、xの指数部分（expX）の大きさにより、1/piの二値表現(Fraction_RCP_PI)の一部(Fraction_EffectBits)を選択することによって、x/piの概算を計算するように更に構成されている、請求項２に記載のシステム。
【請求項４】
Fraction_RCP_PIは２１６ビットを有しており、前記三角回路は、
expXが２５以上である場合には、Fraction_EffectBits = Fraction_RCP_PI[215:215-95]とし、
expXが２５以上ではない場合には、Fraction_EffectBits = Fraction_RCP_PI[215-expX+25:215-expX+25-95]とすることによって、Fraction_EffectBitsを選択するように更に構成されている、請求項３に記載のシステム。
【請求項５】
前記三角回路は、
Fraction_RCP_PIを４個の部分High, Mid, Low1, 及び Low2に分割し、
x（manX）の仮数にMul1のHighを乗算し、
manXにMul2のMidを乗算し、
manXに、Mul3のLow1を乗算し、
manXに、Mul4のLow2を乗算する、ことによって、
x/piの概算を計算するように更に構成されている、請求項４に記載のシステム。
【請求項６】
前記三角回路は、
ExpOfFraction_EffectBits = (expX >= 25) ? 2 + 25 - expX : 2を定義し、
manXに、ExpOfFraction_EffectBitsに等しいHighの指数(expHigh)を有する、
Mul1のHighを乗算し、
manXに、expHigh - 24に等しいMidの指数(expMid)を有する、Mul2のMidを乗算し、
manXに、expHigh - 48に等しいLow1の指数(expLow1)を有する、Mul3のLow1を乗算し、
manXに、expHigh - 72に等しいLow2の指数(expLow2)を有する、Mul4のLow2を乗算することによって、x/piの概算を計算するように更に構成されている、請求項５に記載のシステム。
【請求項７】
前記三角回路は、
expXがゼロより小さいとき、AdderAllの前記出力の符号が、前記三角回路によって変更されないように、値FinalSignを０に等しく設定することによって、
ｔを計算するのに有効な、前記加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理するように構成されている、請求項１に記載のシステム。
【請求項８】
前記三角回路は、少なくともオペコードを受信し、前記オペコードが、Sineを示す場合、値isSignを１に等しく設定し、前記オペコードがCosineを示す場合には、値isCosを１に等しく設定するように構成されており、
前記三角回路は、
expXが２５より大きい場合、expX'を２５に設定し、
expXが２５以下の場合、expX'をexpXに等しく設定し、
Mul1の前記出力と、Mul2の前記出力のビット４７〜２４をAdder12に入力し、
Mul2の前記出力のビット２３〜０と連結されたAdder12の前記出力と等しい72 bits (Bit[71:0])を含む値Adder12_0を設定することによって、tを計算するのに有効な前記加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理し、
最初に、expX’が２以上である場合、Bit[71:73-expX’] = 0と設定し、
二番目に、expX’が１以上の場合、（ａ）Bit[72-ExpX’] = isSin ? Bit[72 - ExpX’] : Bit[72 - ExpX’]^Bit[71 - ExpX’]と設定し、次に、（ｂ）FinalSignをBit[72 - ExpX’]に等しく設定し、次に、（ｃ）Bit[72 - ExpX’] = 0と設定し、
三番目に、expX’が１以上でないが、０より小さくはない場合には、FinalSign = isSin ? 0 : Bit[71]と設定し、
四番目に、expX’が０より小さくない場合には、Bit[71 - ExpX’] = Bit[71 - ExpX’]^isCosと設定することにより、Adder12_0を処理する、
ように構成されている、請求項７に記載のシステム。
【請求項９】
前記三角回路は、
expX’がゼロより小さくない場合、（ａ）FinalSignをゼロに等しく設定し、（ｂ）値S34From12をゼロに等しく設定し、（ｃ）Adder12_0について、先頭０及び丸め込みを実行することによって、Adder12_1を計算し、（ｄ）Adder12_1 = isSin ? Adder12_1 : -Adder12_1を設定し、
expX’がゼロより小さくなく、Bit[71 - ExpX’]が１に等しい場合、（ａ）S34From12を、Bit[71 - ExpX’]に等しく設定し、（ｂ）Bit[71 - ExpX’:0]を、Bit[71 - ExpX’ : 0]の２の補数に等しく設定し、
expX’がゼロより小さくない場合、Adder12_0について、先頭０及び丸め込みを実行することによって、Adder12_1を計算することによって、tを計算するのに有効な、前記加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理するように構成されている、請求項８に記載のシステム。
【請求項１０】
前記三角回路は、
Mul3の前記出力と、Mul4の前記出力のビット４７〜２４とをAdder34に入力し、
Mul4の前記出力のビット２３〜０と連結されたAdder34の前記出力と等しい４８ビットを含む値Adder34_0を設定し、
Adder34_0について先頭０及び丸め込みを実行することによってAdder34_1を計算し、
S34From12が１に設定された場合、Adder34_1の前記符号を変更し、
Adder34_1 を (expX’ < 0 && isCos) ? 0.5 : Adder34_0に等しく設定することによって、ｔを計算するのに有効な前記加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理するように構成されている、請求項９に記載のシステム。
【請求項１１】
前記三角回路は、
Adder12_1 及び Adder34_1の和として、AdderAllを用いて、AdderAll_0を計算し、
FinalSignが１に等しい場合、AdderAll_0の前記符号を変更し、
tとして、AdderAll_0を出力し、
t＞=0の場合、t = t/2128を設定し、
SinPi(t) 及び CosPi(t)の少なくとも一つを近似するように構成された三角関数回路にtを入力する、ことによって、tを計算するのに有効な、前記加算器Adder12, Adder34, 及び AdderAllを用いて、前記乗算器Mul1, Mul2, Mul3, 及び Mul4の前記出力を処理するように構成されている、請求項１０に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、電子回路を用いて三角関数の計算を実行するためのシステム及び方法に関する。
【背景技術】
【０００２】
従来のコンピュータシステムにおいては、三角関数は、（ａ）基礎的数学演算（加算、減算、乗算、除算など）を用いて、三角関数を計算する一連のコンピュータ命令（ｂ）特定の入力引数又は引数の組に対する三角関数の出力を補間するために用いられるルックアップテーブル（ｃ）三角関数を計算する為に特別にプログラムされた専用回路、のいずれかとして実装される。これらのアプローチのすべては、（ａ）三角関数が複雑である程度に非常に遅い、（ｂ）ルックアップテーブルが小さい場合、低精度である、又は、非常に大きいルックアップテーブルを必要とする高精度である、（ｃ）サイズ制約内では利用できないであろうシリコンチップ上の大面積を必要とする、という欠点を有している。
【０００３】
三角関数を計算するための一般的なアプローチは、ｘを入力引数として、sinPi(t) = sin(π*t), cosPi(t) = cos(π*t), tanPi(t) = tan(π*t)などで関数を計算するように、三角回路を規定することである。入力引数は、しばしば、πの倍数ではなく、ラジアンで表現されるので、そのような関数への入力引数は、ｘをラジアンでの入力引数として、t = x/ πとして計算されなくてはならない。したがって、入力引数を計算することは、処理時間を必要とするか、チップ上のスペースを必要とする追加の処理を必要とする。
【０００４】
本明細書で開示するシステム及び方法は、入力引数t = x/ πを計算するための改善されたアプローチを提供する。
【図面の簡単な説明】
【０００５】
本発明の利点が容易に理解されるように、上に簡単に記述した本発明のより具体的な記述が、添付の図面に図示される特定の実施形態を参照してなされるだろう。これらの図面は、本発明の典型的な実施形態を図示するのみであり、従って、その範囲を限定するとは考えられるべきではないということの理解の下に、本発明は、添付の図面の使用を通して、更なる具体性及び詳細を持って記述され、説明されるだろう。
【０００６】
【図１】本発明の実施形態による、三角関数を計算するためのコンポーネントの模式的ブロック図である。
【図２Ａ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図２Ｂ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図２Ｃ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図２Ｄ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図２Ｅ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図２Ｆ】本発明の実施形態による、4要素内積（Ｄｐ４）回路を用いて、t = x/ πを計算するための方法の処理フロー図である。
【図３】本明細書で開示される回路を実装可能なコンピューティングデバイスの図である。
【発明を実施するための形態】
【０００７】
ここに図面において一般に記述され、図示されるように、本発明のコンポーネントは、広範な様々な異なる構成に配置され、設計されることができることは容易に理解されるだろう。したがって、図に表現されているように、本発明の実施形態の以下のより詳細な記述は、請求されるとおりの本発明の範囲を限定する意図はなく、むしろ、本発明により、現在考えられる実施形態のある例の表現に過ぎない。ここに記述される実施形態は、図面を参照することにより最も良く理解され、図面においては、同様な要素は、全体に渡って、同様な参照番号によって指定されるだろう。
【０００８】
本発明による実施形態は、装置、方法、又はコンピュータプログラム製品として実施されることができる。したがって、本発明は、全体的にハードウェア実施形態、全体的にソフトウェア実施形態（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）、又は、全て、一般に、ここに「モジュール」もしくは「システム」として参照され得るソフトウェアとハードウェアの態様を組み合わせる実施形態の形態を取ることができる。更に、本発明は、媒体に実装されるコンピュータ利用可能なプログラムコードを有する表現の任意の有形な媒体において実装されるコンピュータプログラム製品の形態を取ることができる。
【０００９】
非一時的媒体を含む、１以上のコンピュータ利用可能又はコンピュータ読み取り可能な媒体の任意の組み合わせは、利用されることができる。例えば、コンピュータ読み取り可能な媒体は、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）デバイス、リードオンリーメモリ（ＲＯＭ）デバイス、消去可能プログラマブルリードオンリーメモリ（ＥＰＲＯＭ，又は、フラッシュメモリ）デバイス、ポータブルコンパクトディスクリードオンリーメモリ（ＣＤＲＯＭ）、光ストレージデバイス、及び、磁気ストレージデバイスの１以上を含むことができる。選択された実施形態においては、コンピュータ読み取り可能な媒体は、命令実行システム、装置、もしくは、デバイスによって、又は、これらに関連して、用いられるプログラムを含み、記憶し、通信し、伝搬し、又は、輸送することができる、任意の非一時的媒体を含むことができる。
【００１０】
本発明の動作を実行するためのコンピュータプログラムコードは、Java, Smalltalk, C++などのオブジェクト指向プログラミング言語及び「C」プログラミング言語又は同様なプログラミング言語などの従来のプロシジャープログラミング言語を含む、１以上のプログラミング言語の任意の組み合わせで書かれることができる。プログラムコードは、全体として、スタンドアロンソフトウェアパッケージとしてコンピュータシステム上で、スタンドアロンハードウェアユニット上で、コンピュータからある距離離れたリモートコンピュータ上で部分的に、又は、リモートコンピュータもしくはサーバ上で全体的に、実行されることができる。後者のシナリオにおいては、リモートコンピュータは、ローカルエリアネットワーク（ＬＡＮ）、もしくは、ワイドエリアネットワーク（ＷＡＮ）、を含む、任意の種類のネットワークを介して、コンピュータと接続されることができ、又は、接続は、（例えば、インターネットサービスプロバイダを用いたインターネットを介してなど）外部コンピュータに対してなされることができる。
【００１１】
本発明は、本発明の実施形態による、フローチャート図及び／又は、方法、装置（システム）及びコンピュータプログラム製品のブロック図を参照して、以下に記述される。フローチャート図及び／又はブロック図の各ブロック、フローチャート図及び／又はブロック図のブロックの組み合わせは、コンピュータプログラム命令又はコードによって実装されることができることは、理解されるだろう。これらのコンピュータプログラム命令は、汎用コンピュータ、専用コンピュータ又は、マシンを生成するための他のプログラマブルデータ処理装置のプロセッサに提供されることが出来、コンピュータ又は他のプログラマブルデータ処理装置のプロセッサによって実行する命令が、フローチャート及び／又はブロック図のブロックもしくは複数のブロックで指定される機能／動作を実装するための手段を生成するようにする。
【００１２】
これらのコンピュータプログラム命令は、また、コンピュータ又は他のプログラマブルデータ処理措置を特定の方法で機能させることができる非一時的コンピュータ読み取り可能な媒体に格納されることができ、コンピュータ読み取り可能な媒体に格納される命令が、フローチャート及び／又はブロック図のブロックもしくは複数のブロックで指定される機能／動作を実装する命令手段を含む製造製品を生成するようにする。
【００１３】
コンピュータプログラム命令は、また、一連の動作ステップがコンピュータ又は他のプログラマブル装置上で実行されるようにコンピュータ又は他のプログラマブルデータ処理装置にロードされることができ、コンピュータ又は他のプログラマブル装置上で実行される命令が、フローチャート及び／又はブロック図のブロックもしくは複数のブロックで指定される機能／動作を実装するためのプロセスを提供するように、コンピュータ実装プロセスを生成する。
【００１４】
図１を参照すると、多くの現在のコンピューティングシステムは、内積を計算するための専用回路を実装する、汎用プロセッサ又はグラフィック処理ユニット（ＧＰＵ）を含む。例えば、4入力内積（Ｄｐ４）は、一般に実装回路である。Ｄｐ４回路は、4つの第1の入力(u1, u2, u3, u4)と４つの第2の入力(v1, v2, v3, v4)を受信する。これらの入力は、それから、それぞれ出力Mul1, Mul2, Mul3, 及びMul4を生成する乗算器１００ａ〜１００ｄに入力される。例えば、u1及びv1は、乗算器１００ａに入力され、入力u2及びv2は、乗算器１００ｂに入力され、入力u3及びv3は、乗算器１００ｃに入力され、及び、入力u4及びv4は、乗算器１００ｄに入力される。各乗算器１００ａ〜１００ｄは、それらの２つの入力引数が入力されたなら、積を出力する。乗算器１００ａ、１００ｂの２つの出力は第１の加算器１０２ａに入力され、出力Adder12_0を生成し、他の２つの乗算器１００ｃ、１００ｄの出力は、第２の加算器１０２ｂに入力され、出力Adder34_0を生成する。加算器１０２ａ、１０２ｂの出力は、先頭のゼロを特定する先頭０及び丸め込みステージ１０４によって更に処理され、加算器１０２ａ、１０２ｂの出力の指数を決定し、加算器１０２ａ、１０２ｂの出力を丸め込んで、適切な仮数サイズにする。
【００１５】
先頭０及び丸め込みステージ１０４の出力は、それから、最終加算器ステージ１０６に入力される。最終加算器ステージ１０６の出力(“AdderAll”)は、第１と第２の入力引数の内積である。
【００１６】
図１に明らかなように、他のコンポーネントは、入力引数t = x/ πを計算する為に、Ｄｐ４回路１００ａ〜１００ｄ、１０２ａ〜１０２ｂ、１０４、及び１０６を用いるために、本明細書で開示する実施形態により、従来のＤｐ４へ追加されることができる。特に、1/ πの表現は、第１の引数として、乗算器１００ａ〜１００ｄに入力されることができ、入力引数ｘは、第２の引数として、乗算器１００ａ〜１００ｄに入力されることができる。特に、1/ πの表現のビットの異なるセグメントは、引数u1からu4として入力されることができ、第２の入力引数は、v1 = v2 = v3 = v4 = xに設定される。
【００１７】
引数ステージ１０８は、u1からu4として入力される、1/πの表現の一部を計算する。引数ステージ１０８の動作は、図２Ａに示されるステップの幾つか又は全てを実装することができる。
【００１８】
シフトステージ１１０は、図２Ｂ〜図２Ｅに示されるステップの幾つか又は全てを実行することなどによって、乗算器１００ａ〜１００ｄの出力を調整する。加算器１０２ａ、１０２ｂの出力は、また、図２Ｅに示されるステップの幾つかを実行することなどによって、アド調整及び符号ステージ１１２によって調整されることができる。加算器１０６の出力の符号は、図２Ｆの方法を実装することなどによって、最終符号ステージ１１４によって調整される。
【００１９】
ステージ１０８、１１０、１１２、１１４の動作の結果は、（１）によって入力引数を計算することである。
【数１】
2017199370.tif 000003
【００２０】
特に、ステージ１０８、１１０、１１２、１１４の動作は、浮動小数点制度の限界内で、（１）を近似することである。この用途のため、式を「近似する」ことは、式の出力を表すために用いられる浮動小数点の１０ＵＬＰ(unit in last place)内で、式の出力を近似することを意味する。同様に、数学的関数としてここに示される任意の計算は、数学的関数の出力の浮動小数点表現の１０ＵＬＰ内にその数学的関数を近似する浮動小数点動作を開示するものと理解されることができる。
【００２１】
（１）に対する動機は、t = x/ πを計算するときに、中間値を表すために、利用可能な制限されたビット数から帰結する誤差を避けることである。指数(expV)、仮数(mantissaV)、及び符号sign (signV)の３つの部分を含む、浮動小数点値Vとして、数を表現することができる。幾つかの表現においては、任意の浮動小数点値Ｖは、#BitsMantissaVを、仮数を表すために用いられるビット数として、（２）によるこれらの３つの部分を用いて、近似されることができる。
【数２】
2017199370.tif 000004
【００２２】
SignV は二値であり、値Ｖが、負（１−＞負、０−＞非負）であるか否かを表す。ExpVは、値Ｖのスケールを表す整数であり、整数仮数Ｖは、データの精度である。
【００２３】
Ｄｐ４の幾つかの実装においては、４つの乗算器１００ａ〜１００ｄの夫々は、４８ビット仮数を出力する。加算器１０２ａ、１０２ｂは、７２ビット仮数を出力し(Adder12_0, Adder34_0)、それから、４８ビット仮数に丸め込む。u1*v1 + u2*v2において、ビットキャンセルが存在しえるので、Adder12_0の先頭０位置を発見し、先頭０位置から４８ビット仮数を維持しなければならない。
【００２４】
最終加算器１０６は、２つの入力を得、両者は、４８ビット仮数が標準３２ビット浮動小数点値（２３ビット仮数＋１の後ろの１ビット）を出力させる。
【００２５】
浮動乗算器１００ａ〜１００ｃ内部では、浮動小数点値を指数と仮数に分離する。乗算器１００ａ〜１００ｃの結果は、新規仮数＝仮数U1＊仮数V1（４８ビット）及び新規指数＝指数U1＋指数V1＋１として考えることができる。
【００２６】
三角関数Sin(x), Cos(x) 及び Tan(x)を計算するとき、高精度SinPi(t)命令が利用可能であるので、上記したように、Sin(x) = SinPi(x/π)として、関数を計算することができる。しかし、t = x/πを処理するとき、問題がある。|x| < 2-126*πならば、ｔは、（2-126より小さい）非規格化数である。幾つかの処理デバイスは、非規格化数をサポートしないので、そのような小さな値は、ゼロと解釈されるだろう。したがって、|x| < 2-126*π対し、Sin(x) = SinPi(t) = 0である。相対誤差は、正しい値が実際に、xにとても近いので、１００％である。他の問題は、t = x/πの精度をどのように維持するかである。xが非常に大きい（226より大きい）場合、t = x/πの通常の浮動小数点計算は、整数部分のみが維持でき、これは、Sin(x) = SinPi(t) = 0である。相対誤差は、また、１００％である。
【００２７】
Sin(x)を正しく計算する多くの方法がある。最も有名なものは、“Payne and Hanek’s reduction method” (M. Payne and R. Hanek,  “Radian reduction for trigonometric functions,” SIGNUM Newsletter, 18:19-24, 1983)であり、これは、その全体が、参照により、本明細書に組み込まれる。しかし、直接この方法を実装することは、多くの命令を必要とするだろう。本明細書で開示する実施形態においては、従来のＤｐ４回路を、xの実数値について（３）を計算する為に変形する。
【数３】
2017199370.tif 000005
【００２８】
数学的には、この式では、Sin(x) = Sin(π*t) = SinPi(t), 及び |t|≦0.5である。しかし、|x| < 2-126*πの場合、（３）の出力は、|x|/πにおける非正規化浮動小数点値である。この場合を正しく扱うために、tは、（４）によって決定される。
【数４】
2017199370.tif 000006
【００２９】
|t|<2.0について、SinPi(t)を計算するために、SinPi()パイプラインにtが渡されるとき、SinPi パイプラインは、|t|>=2.0のときに、t/2128（入力の指数を調整する）に返すために、少し変更される。数学的には、tは、したがって、（１）によって決定される。
【００３０】
図２Ａ〜図２Ｆを参照すると、図示した方法は、最終計算の精度を改善し、そのために、多くのコンピューティングシステムにおいて一般的に利用可能な回路を用いるために、（１）により、t = x/πの近似を出力するために、Ｄｐ４回路の中間と最終の値を変換するステージ１０８、１１０、１１２、及び１１４の関数を例示する。
【００３１】
図２Ａを特に参照すると、値“Fraction_RCP_PI”は、予め定義され、方法２Ａを実装する回路に格納されることができ、ここで、Fraction_RCP_PIは、1/ πの近似である。幾つかの実施形態において、Fraction_RCP_PI は、２１６ビット値である：Fraction_RCP_PI[215:0] = {0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148}
【００３２】
図２Ａの方法は、xの大きさにより、Fraction_RCP_PI の一部を選択することを含む。例えば、この方法は、xから指数部分(expX)を取得すること２００と、expXが、２５以上か否かを評価すること２０２とを含むことができる。そうでなければ、値Fraction_EffectBits は、Fraction_RCP_PI[215:215-95]、つまり、Fraction_RCP_PI の最初の９６ビットに等しく設定される２０４。そうであれば、Fraction_EffectBitsは、Fraction_RCP_PI[215-expX+25:215-expX+25-95]に等しく設定され２０６、つまり、expXが２５を超える量だけ、右（ＬＳＢ方向）に９６ビットウィンドウを移動する。
【００３３】
Fraction_EffectBits の異なる部分と、xの仮数(manX)は、乗算器１００ａ〜１００ｃに入力される。特に、Fraction_EffectBits は、high, mid, low1, 及び low2値に分割されることができ、ここで、high = Fraction_EffectBits[95:72], mid = Fraction_EffectBits[71:48], low1 = Fraction_EffectBits[47:24], low2 = Fraction_EffectBits[23:0]である。換言すれば、Fraction_EffectBits = {high[23:0], mid[23:0], low1[23:0], low2[23:0]}であり、ここで｛｝は、連結を表す。
【００３４】
図２Ａに示されるように、乗算器１００ａ〜１００ｄは、manX*high として、値Mul1を計算し２０８；manX*mid として、値Mul2を計算し２１０；manX*low1 として、値Mul3を計算し２１２；manX*low2 として、値Mul4を計算する２１４。個別の回路が、各乗算器１００ａ〜１００ｃを実装することが可能な限り、ステップ２０８〜２１４は、並列に実行されることができる。
【００３５】
Mul1からMul4に用いられるFraction_EffectBits の指数は、式(expX >= 25)?-2+25-expX:-2の出力として、値ExpOfFraction_EffectBits を計算すること２１６によって計算され、ここで、(a?b:c)は、ａがｔｒｕｅ（１）ならｂを、ａがｆａｌｓｅ（０）ならｃを出力する三値演算子である。Fraction_EffectBits (high, mid, low1, 及び low2)の一部についての指数(expHigh, expMid, expLow1, expLow2)は、以下のようにして計算される２１８〜２２４：
expHigh = ExpOfFraction_EffectBits
expMid = expHigh-24
expLow1 = expHigh-48
expLow2 = expHigh-72
【００３６】
上記したように、乗算するときは、引数の仮数が乗算され、指数が加算される。従って、各乗算器出力Mul1, Mul2, Mul3, 及び Mul4については、対応する指数は、それぞれ、expX+expHigh, expX+expMid, expX + expLow1, 及び expX+expLow2であろう。
【００３７】
図２Ｂを参照すると、乗算器１００ａ〜１００ｄの出力（つまり、仮数部分）は、（１）を実装し、精度の損失を避けるために、調整されることができる。
【００３８】
加算器１０２ａは、Mul1及びMul2を受信し、ステップ２２６において、その和を出力する。Mul1及びMul2は、単純に加算器１０２ａに入力されるのではなく、シフトされ、処理されるだろう。例えば、Mul1[47:0] 及び Mul2[47:24]は、加算器１０２ａに入力されることができる。加算器の出力は、それから、ビットBit[71:0]を有する値Adder12_0を得る為に、Mul2[23:0]と連結される。
【００３９】
値expX’は、ステップ２２８において、expX 及び２５のうちの大きい方に等しく計算されることができる。expX’が、ゼロより小さいことがわかったなら２３０、以下に記述する、図２Ｃにおいて、処理が継続する。expX’が、２以上であると分かったなら２３２、Bit[71:73-expX’]は、ステップ２３４において、ゼロに設定される。
【００４０】
expX’が１以上であると分かったなら２３６、Bit[72-expX’]は、(isSin ? Bit[72-expX’] : Bit[72-expX’]^Bit[71-expX’])に等しく設定され２３８、ここで、tがSinPi()への入力引数として用いられるだろうことを示すオペコードが受信されるとき、isSin は１である。この開示の目的のため、記号「＾」は、ＸＯＲ（排他的ＯＲ）演算を示す。expX’が、１以上であると分かったなら２３６、値FinalSign は、Bit[72-expX’]に等しく設定され２４０、ここで、FinalSignは、以下に記述するように、加算器１０６の出力の符号を変更するために用いられる。同様に、expX’が１以上であると分かったなら２３６、Bit[72-expX’]は、ゼロに等しく設定される２４２。
【００４１】
expX’が１以上であり、expX’がゼロより小さくないことが分かったなら２３６、FinalSignは、(isSin ? 0 : Bit[71])に等しく設定される２４４。
【００４２】
何れの場合においても、FinalSign は、加算器１０６の出力を調整するために用いるために出力され２４６、Bit[71-expX’]は、Bit[71-expX]^isCos に等しく設定され２４８、ここで、isCos は、tがCosPi()を計算するために用いられるべきことを示すときに受信されるオペコードである。もっとも、CosPi()の近似は、SinPi(t)を実装する回路の出力を操作することにより得られえる。幾つかの実施形態においては、単一のフラグが設定され、つまり、SinPi(t)が計算されるべきことをオペコードが示す場合、isSin は１に設定されえ、その他の場合は、０である。フラグisCosは、NOT(isSin)に等しく設定されるだろう。
【００４３】
図２Ｃを参照すると、expX’が、ゼロより小さいと分かった場合には２３０、FinalSign は、ゼロ（符号変更なし）に設定され２５０、値S34From 12が、ゼロに設定され２５２、値S34From 12の使用は、図２Ｅについて以下に記述するように、加算器１０２ｂの出力の符号を調整するために用いられる。先頭０及び丸め込みの特定が実行され２５４、それぞれ、当分野で知られているように、Adder12_0における先頭０の位置により調整されたAdder12_0とexpX’に基づいて、仮数と指数を有する新規の浮動小数点値Adder12_1となる。Adder12_1は、更に、(isSin ? Adder12_1 : -Adder12_1)に等しく設定されること２５６ができる。
【００４４】
expX’がゼロより小さいと分かった場合には２３０、図２Ｄのステップが、図２Ｂのステップに続いて実行される。特に、Bit[71-expX’]が、１に等しいと分かった場合には２５８、S34From12は、Bit[71-expX’]に等しく設定され２６０、Bit[71-expX’:0]は、Bit[71-expX’:0]の２の補数に等しく設定される２６２。S34From12は、出力され２６４、先頭０及び丸め込みの特定は、Adder12_1を得る為のステップ２５４についてと同様に、Adder12_0について、実行される２６６。
【００４５】
図２Ｂ〜図２Ｄの処理は、加算器１０２ａの出力について実行される。図２Ｅの処理は、加算器１０２ｂの出力を処理するための図２Ｂ〜図２Ｄの処理と並列して実行されることができる。
【００４６】
値Adder34_0は、Mul3[47:0] 及び Mul4[47:24]を加算器１０２ｂに入力し、Mul4[23:0] = 0つまり、２４ビットのゼロと加算器１０２ｂの出力とを連結することにより計算されることができる２６８。値Adder34_1は、値Adder12_0について上記したような同様な方法で、Adder34_0について先頭０及び丸め込みの特定を実行すること２７０によって計算されることができる。S34From12が、１であると分かった場合には２７２、Adder34_1の符号は変更される。Adder34_1の値は、更に、((expX’ < 0 && isCos) ? 0.5 : Adder34:0)に等しく設定される２７６。
【００４７】
図２Ｆを参照すると、値AdderAll_0は、図２Ｂから図２Ｅのステップからの出力として、Adder12_1 及び Adder34_1を、加算器１０６に入力し、加算器１０６の出力として、AdderAll_0を受信することによって、計算される２７８ことができる。FinalSign が１であると分かった場合には２８０、AdderAll_0の符号は変更される。いずれの場合においても、AdderAll_0は、出力され、SinPi(t), CosPi(t), TanPi(t)又は任意の他の三角関数などの三角関数回路に対する入力引数tとして用いられる。特に、オペコードがisSin の場合、tは、SinPi(t)に対応する三角関数回路に入力される。オペコードがisCos である場合は、tは、CosPi(t)に対応する三角関数回路に入力される。他のオペコードは、他の三角回路へのtの入力を引き起こしうる。
【００４８】
入力引数t(AdderAll_0)は、先頭０及び丸め込みステップ２６６、２７０により決定されるように、Adder12_1 及び Adder34_1の仮数と指数により決定される仮数(ManT)と指数(ExpT)を含む。幾つかの実施形態においては、t＞=2ならば、tをSinPi()に入力する前に、tは、t/(2128)に等しく設定される。これは、単純な演算で、ExpT: ExpT = ExpT - 128への演算が必要なだけである。
【００４９】
上記した回路がどのように用いられうるかの説明と例が以下に記述される。
【００５０】
入力が浮動形式x、expX の指数＝exp(x)、manXの仮数＝man(x)であると仮定する。この方法は、1/πの小数部分の２１６ビットを節約する（1/πのexpは-2
）ことを含む。従って、1/π=Fraction_rcp_pi[215:0] *2-128で、Fraction_rcp_pi[215] = 1である。
【００５１】
Fraction_rcp_pi を１６進数表記で書く場合、それは、Fraction_rcp_pi[215:0] = {0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148}である。Fraction_rcp_pi = -2の指数部分（MSB1は0.25を意味する）で、(２)に従う。
【００５２】
Fraction_rcp_pi の９６ビットは、expX の大きさに基づいて選択される。数学的には、x/π = manX * Fraction_rcp_pi[215:0]*2-128+expX-23である。これが完全に実装されれば、非常に大きな面積を必要とする２４×２１６ビット整数乗算器が必要であろう。結果が、小数部分の仮数部分の２４ビットのみを維持するので、そのような巨大な乗算器は必要ない。
【００５３】
expX が非常に大きい場合、x/pi は、sin(x)の精度に対しては不要な多くの整数ビットを生成するだろう。従って、fraction_rcp_piの一部が選択される：
【００５４】
Fraction_EffectBits[95:0]  =  (expX) ≧25  ?  Fraction_rcp_pi [215-expX+25: 215-expX+25-95]: Fraction_rcp_pi [215: 215-95]
【００５５】
値high, mid, low1, low2が、有効な小数Fraction_EffectBitsの９６ビットから選択される：{high[23:0], mid[23:0], low1[23:0], low2[23:0] }  =  Fraction_EffectBits [95:0]。
【００５６】
上記したＤｐ４エンジン（図１）は、manX * Fraction_EffectBits [95:0]を計算する為に用いられる：
【００５７】
manX * Fraction_EffectBits [95:0] = manX*high + manX*mid + manX * low1 + manX*low2 = mul1 + mul2 + mul3 + mul4
【００５８】
ExpOfFranction_EffectBits =  (expX)≧25 ? -2 + 25 - expX : -2   
【００５９】
expHigh = ExpOfFranction_EffectBits, expMid = expHigh - 24, expLow1 = expHigh - 48, and expLow2 = expHigh - 72
【００６０】
mul1 + mul2は、いかなるキャンセルも有しないので、Adder12_0は、７２ビットの仮数（仮数Adder12_0）及び指数expAdder12_0 = expHigh+expX + 1を出力する。
【００６１】
expX ≧ 25, expAdder12_0 = 24のとき、これは、71 - 24 = 47の位置の１のビットを意味する。x/πの幾つかの偶数の数を表す、仮数ExpAdder12_0[71: 48]を除去する（値ゼロに設定する）ことができる。expMul1 = expMul2 + 2且つＤｐ４内で、４８ビット加算器のみが用いられるので、われわれは、仮数Adder12_0[71:24] = (Mul1[47:0]<<24) + Mul2[47:24]を設定し、Mul2[23:0]を仮数Adder12_0[23:0]に送る。
【００６２】
可変仮数Adder12_0[47: 47]は、最終結果AdderAll の符号ビットである。従って、FinalSign = mantissaAdder12_0[47: 47]であり、符号ビット情報をAddAllに設定後、われわれは、仮数Adder12_0[47: 47]もゼロに設定する。
【００６３】
可変仮数ExpAdder12_0[46: 46]は、式（１）の第２行を適用するか、又は第１行を適用するかを決定する、
【数５】
2017199370.tif 000007
であるか否かを示す。従って、S34From12 = mantissaExpAdder12_0[46: 46]とすると、仮数ExpAdder12_0[46:0]を以下のように変更する：   
mantissaAdder12_0[46:0] =                                              
mantissaAdder12_0[46:0]^S34From12 + S34From12              (5) 
【００６４】
更に、Adder34の符号ビットとして、S34From12を出力する。式（５）は、２の補数でのAdder12_0部分についてのS34From12 = 1の間、
【数６】
2017199370.tif 000008
を処理し、Adder34についての符号を変更し、それによって、減算を発生させる。
【００６５】
そのような変更をした後、改変Adder12_0を先頭０及び丸め込みステップに出力し、丸め込み後４８ビット精度の新規のexpAdder12 及び mantissaAdder12を有するAdder12を得る。Adder34_0 から Adder34_1へは、以前のＤｐ４処理と同一であるが、Adder34の符号ビットは、S34From12に変更されるだろう。
【００６６】
1≦ expX < 25のとき、high = Fraction_rcp_pi[215:215-23]である。
【００６７】
値expAdder12_0 = expHigh+expX + 1 = expX - 1。Adder12_0の１の位置は、71 - (expX - 1)である。expX ≧ 25を扱うことに関して、73 - expX ≦ 71ならば、mantissaAdder12_0[71: 73-expX]をゼロに設定する。そして、１の位置ビットmantissaAdder12_0[72-expX: 72-expX]をAdderAllの符号に送る。そして、FinalSign = mantissaAdder12_0[72-expX: 72-expX]である。符号ビット情報をAdderAllに設定後、mantissaAdder12_0[72-expX: 72-expX]をゼロに設定する。S34From12 = mantissaAdder12_0[71-expX: 71-expX] （１／２の位置）であり：
【数７】
2017199370.tif 000009
を得る。
【００６８】
Adder34の符号ビットとして、S34From12を更に出力する。２の補数と共に、Adder12_0部分について、S34From12 = 1である間、式（６）は、
【数８】
2017199370.tif 000010
を処理し、Adder34の符号を変更し、それによって、減算を発生させる。
【００６９】
そのような変更を行った後、改変Adder12_0を先頭０及び丸め込みステップに出力し、丸め込み後４８ビット精度で、新規のexpAdder12 及び mantissaAdder12を有するAdder12_1を得る。Adder34_0から Adder34_1へは、以前のＤｐ４処理と同一であるが、Adder34_1の符号ビットは、S34From12へと変わるだろう。
【００７０】
expX = 0のとき、１/２の位置は、７１である。S34From12 = Adder12_0[71: 71]であり、式（６）も適用される。Adder12_0は、先頭０及び丸め込みステップに渡され、丸め込み後、４８ビット精度の新規のexpAdder12 及び mantissaAdder12を有するAdder12を得る。
【００７１】
Adder34_0 から Adder34_1へは、以前のＤｐ４処理と同一であるが、Adder34の符号ビットは、S34From12に変更されるだろう。
【００７２】
expX < 0のとき、|x|<1.0、|x|/π< 0.32<0.5であり、１／２のビットは、常時０である。Adder12_0は、先頭０及び丸め込みステップに渡され、丸め込み後、４８ビット精度を有する新規のexpAdder12及び matissaAdder12を有するAdder12_1を得る。Adder34_0 から Adder34_1へは、以前のＤｐ４処理と同一である。しかし、Mul4のＬＳＢ２４ビットを切り捨てることができる。
【００７３】
先頭０計算は、実際に、mantissaAdder12_0の７１ビットを有するように見えるが、mantissaAdder12_0[1/2’s pos -1: 1/2’s_pos-48]の４８ビットを先頭０計算に入れるのみである。全単精度について、mantissaAdder12_0[1/2’s pos]の後、多くても３２個のゼロしかない。
【００７４】
式（６）は、７１ビット固定小数点加算器（S34From12 = 1なら、NOTを実行した後+１）を有することができる。mantissaAdder12_0 =  Fraction_rcp_pi[215:215-23]*manX = 0xa2f983_6e4e44*manX なので、少し簡単化を行う。多くとも23+2 LSB のゼロしかないので、ＬＳＢ２６ビットについて、~MantissaAdder12_0[0,25]+1を計算するのみでよく、残りのＭＳＢについては、〜（NOT）演算をするのみである。これは、７１ビットの２の補数を、２６ビットの２の補数と４５ビットのNOT演算に分離する。
【００７５】
先頭ゼロ計算の後、４８ビット精度で、mantissaAdder12を維持するのみである。問題は、４８ビット精度で十分か？ということである。Adder12は、減算が発生する場合(S34From12 = 1 の場合)、Adder34において、幾つかのビットをキャンセルすることができる。mantissaAdder34[47,47]がmantissaAdder12_0[23,23]と整列するので、mantissaAdder12_0の先頭ゼロが２３又は２４のとき、キャンセルが発生するのみである。両者の場合、Adder12の全精度を有し、４８ビット仮数を維持する。
【００７６】
理論的には証明できないが（理論的には、mantissaAdder34のＭＳＢの２４ビットは、おそらく、キャンセルし、２４ビット精度のみを残す）、mantissaAdder34の４８ビットを維持することは、十分である。しかし、すべての浮動小数点値を尽くしたので、mantissaAdder34でキャンセルするビットの最大数は、８である。これは、Adder12_1+Adder34_1の後、少なくとも４０有効ビットを維持することを意味する。これは、２４ビット仮数精度でAddAllを得るために、Adder12_0 及び Adder34_1について、３２ビット仮数を用いることができることを意味する。
【００７７】
以下の例は、Cos(x) = Sin(x + 0.5π) = Sin(0.5π - x)を計算するために、上記した回路を用いることを扱う。0.5πを加算することは、1/2の位置で、Adder12_0に１を加算することと同一である。もちろん、1/2の位置を知らなくてはならない。1/2の位置で1を加算するべきならば、他の固定小数点加算器が必要だろう。幾つかの実施形態においては、以下の条件により、S34From12, FinalSignのみを計算する。
【表１】
2017199370.tif 000011
【００７８】
式（５）は、Cos(x)を計算するとき、expX ≧ 25について、依然適用される。式（６）は、同様に、0≦ expX < 25について適用される。expX < 0について、Cos(x) = Sin(0.5π - x) = SinPi(0.5 - x/π)であり、Adder12符号を負に変更するのみで、Adder34を０．５にする(expAdder34 = -1, mantissaAdder34 = 1<<47)。そして、adder12において、４８ビット高精度を有するので、AdderAllにおいて、十分な精度で、0.5 - x/πを有する。
【００７９】
以下の例は、先頭０の３１ビットを有するSin(x)を計算することを扱う。この例は、X  =  0x67098498;  (S=0,  expX=79, manX=0x898498) 及びFraction_rcp_pi[215:0] = {0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148}を仮定する；
【００８０】
ステップ１は、関数Fraction_EffectBits[95:0]  =  (expX) ≧25  ?  Fraction_rcp_pi [215-expX+25: 215-expX+25-95]: Fraction_rcp_pi [215: 215-95]により、９６ビットの有効な小数部分を選択することである。Fraction_rcp_pi[215:0]の７９〜２５ビットを左シフトし、それから、高９６ビットを得、したがって、Fraction_EffectBits[95:0]  =4a7f09_d5f47d_4d3770_36d8a5。
【００８１】
Fraction_EffectBits５４ビットを左シフトしたので、Fraction_EffectBitsの指数は、ExpOfFranction_EffectBits =  -2 -54 (Fraction_rcp_piの初期指数は -2 )である。
【００８２】
ステップ２は、manX * Fraction_EffectBits[95:0]を計算するために、Ｄｐ４エンジンを用いることである。最初、{high[23:0], mid[23:0], low1[23:0], low2[23:0] }  =  Fraction_EffectBits [95:0]を設定する。したがって、manX * Fraction_EffectBits [95:0] = manX*high + manX*mid + manX * low1 + manX*low2 = mul1 + mul2 + mul3 + mul4を得る。
【００８３】
ステップ２においては、すべての乗算結果は、以下の通り、４８ビットの仮数を維持し、４つの指数を乗算する：
【００８４】
exp_of_mul1 = 79+(-2-54) +1=24 ; mul1 = 0x280491_8d1158;
【００８５】
exp_of_mul2 = exp_of_mul1 -24;   mul2 = 0x72eea7_fe9e38;
【００８６】
exp_of_mul3 = exp_of_mul1 -48;   mul3 = 0x297aa9_5eaa80; 及び
【００８７】
exp_of_mul4 = exp_of_mul1 -72;   mul4 = 0x1d7658_92b5f8.
【００８８】
４個の乗算結果は、表２に示されるように、アラインメントであるべきである。
【表２】
2017199370.tif 000012
【００８９】
ステップ３において、個別に、Adder12_0 及び Adder34_0を計算する為に、２個の並列加算器を用いる。このステップでは、Adder12 = mul0 + mul1を計算する為に、７２ビット加算器を用いる。幾つかの実装においては、実際の７２ビット加算器は、実装されない。むしろ、Ｄｐ４エンジンは、４８ビット加算器を持つのみであろう。従って、Adder12_0は、Adder12_0[71:24]] = Mul1[47:0] + Mul2[47:24] (整列された LSBs)として計算され、Adder12_0[23:0]は、Mul2[23:0]と等しく設定される。
【００９０】
例示された例においては、これは、Adder12_0 [71:0]  = 0x280491_FFFFFF_fe9e38を与える。１の位置が４７であるので、４７より上のビットをゼロに設定し、ビット−４７を最終符号に移動する。つまり、mantissaAdder12_0[46:46] = 1, つまり S34From12 = 1, 及び mantissaAdder12_0[46:0] = (mantissaAdder12_0[46:0]^0x7FFFFF_FFFFFF) + 1  = 0x000000_0161c8なので、FinalSign = 1, mantissaAdder12_0[71:0] = 0x000000_7FFFFF_FE9E38である。
【００９１】
最後に、先頭０（３１）及び丸め込み（この場合は丸め込みは不必要）の発見を実行する。したがって、expAdder12 = -31, mantissaAdder12 = 0xB0E400000000を有する。
【００９２】
ステップ３は、改変されていないＤｐ４エンジンによる処理を実行することを含みうる、Adder34_1を得ることを更に含む。幾つかの実施形態においては、Adder34_0[47:0]は、Mul3[47:0] + Mul4[47:24] (LSBにおいて整列された)に等しく設定される。Mul4[23:0]は単純に無視される。
【００９３】
この例においては、これは、leading 0 = 2でAdder34_0 [47:0]  = 0x297AA9_7C20D8を与える。したがって、Adder34_0は、規格化され、Adder34_1: expAdder34 = -24 - 2 = -26, mantissaAdder34[47:0] = 0x A5EAA5_F08360, signAdder34 = S34From12 = 1を得る。
【００９４】
ステップ４において、FinalSign で、(Adder12 + Adder34)を計算する。expAdder34 = expAdder12 + 5なので、mantissaAdder12を１／３２にスケーリングし、加算に進む。Adder34の符号が、Adder12の符号と異なることを考慮すると、
【００９５】
mantissaAdderAll = |0xB0E400000000/32 - 0x A5EAA5_F08360| = 0xA06385_F08360,
【００９６】
expAdderAll = expAdder34 - leading0(mantissaAdderAll) = -26,及び
【００９７】
signAdder12 = signAdder34 ^ FinalSign = 1^1 = 0を得る。
【００９８】
丸め込みで、最終出力t = 0xA06386*2-26*2-23を得る。
【００９９】
ハイド１（hide 1）を除去すると、１６進数表現Hex(t) = 0x32A06386を得る。
【０１００】
図３は、例示的コンピューティングデバイス３００を図示するブロック図である。コンピューティングデバイス３００は、本明細書で議論したような様々なプロシジャーを実行するために用いられることができる。コンピューティングデバイス３００は、サーバ、クライアント、又は、任意の他のコンピューティングエンティティとして機能することができる。コンピューティングデバイスは、本明細書で開示した方法を実行する回路を組み込むことができ、三角関数を計算する為に、本明細書で開示された方法を実施するアプリケーションプログラムなどの１以上のアプリケーションプログラムを実行することができる。コンピューティングデバイス３００は、デスクトップコンピュータ、ノートブックコンピュータ、サーバコンピュータ、ハンドヘルドコンピュータ、タブレットコンピュータなどの広範な様々のコンピューティングデバイスの任意のものとすることができる。
【０１０１】
コンピューティングデバイス３００は、１以上のプロセッサ３０２、１以上のメモリデバイス３０４、１以上のインタフェース３０６、１以上の大容量ストレージデバイス３０８、１以上の入出力（Ｉ／Ｏ）デバイス３１０、及び、ディスプレイデバイス３３０を含み、これらすべては、バス３１２によって結合される。（複数の）プロセッサ３０２は、（複数の）メモリデバイス３０４及び／又は（複数の）大容量ストレージデバイス３０８に格納される命令を実行する１以上のプロセッサ又はコントローラを含む。（複数の）プロセッサ３０２は、また、キャッシュメモリなどの様々な種類のコンピュータ読み取り可能な媒体を含むことができる。
【０１０２】
（複数の）メモリデバイス３０４は、揮発性メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ）３１４）及び／又は不揮発性メモリ（例えば、リードオンリーメモリ（ＲＯＭ）３１６）などの様々なコンピュータ読み取り可能な媒体を含む。（複数の）メモリデバイス３０４は、また、フラッシュメモリなどの書き換え可能なＲＯＭも含むことができる。
【０１０３】
（複数の）大容量ストレージデバイス３０８は、磁気テープ、磁気ディスク、光ディスク、固体メモリ（例えば、フラッシュメモリ）などの様々なコンピュータ読み取り可能な媒体を含む。図３に示されるように、特定の大容量ストレージデバイスは、ハードディスクドライブ３２４である。様々なドライブは、また、様々なコンピュータ読み取り可能な媒体との読み書きを可能とするために、（複数の）大容量ストレージデバイス３０８に含まれることができる。（複数の）大容量ストレージデバイス３０８は、着脱可能な媒体３２６及び／又は着脱不可能な媒体を含む。
【０１０４】
（複数の）Ｉ／Ｏデバイス３１０は、データ及び／又は他の情報が、コンピューティングデバイス３００へ入力され、又は、コンピューティングデバイス３００から検索されたりすることを可能とする様々なデバイスを含む。（複数の）例示的Ｉ／Ｏデバイス３１０は、カーソル制御デバイス、キーボード、キーパッド、マイク、モニタ又は他のディスプレイデバイス、スピーカ、プリンタ、ネットワークインタフェースカード、モデム、レンズ、ＣＣＤ又は他の画像捕捉デバイスなどを含む。
【０１０５】
ディスプレイデバイス３３０は、コンピューティングデバイス３００の１以上のユーザに、情報を表示することができる任意の種類のデバイスを含む。ディスプレイデバイス３３０の例は、モニタ、ディスプレイ端末、ビデオ投影デバイスなどを含む。
【０１０６】
グラフィック処理ユニット（ＧＰＵ）３３２は、（複数の）プロセッサ３０２及び／又はディスプレイデバイス３３０と結合することができる。ＧＰＵは、コンピュータが生成した画像をレンダリングし、他のグラフィック処理を実行するように動作することができる。ＧＰＵは、（複数の）プロセッサ３０２などの汎用プロセッサの機能の幾つか又は全部を含むことができる。ＧＰＵは、また、グラフィック処理に特有の更なる機能を含むこともできる。ＧＰＵは、変換、網掛け、テクスチャリング、ラスタリング、及び、コンピュータが生成した画像をレンダリングするために有用な他の機能を調整することに関連した、ハードコードされた、及び／又は、ハードワイヤードグラフィック機能を含むことができる。
【０１０７】
（複数の）インタフェース３０６は、コンピューティングデバイス３００が、他のシステム、デバイス又はコンピューティング環境と相互作用することを可能とする様々なインタフェースを含む。（複数の）例示的インタフェース３０６は、ローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、無線ネットワーク、及びインターネットへのインタフェースなど、任意の数の異なるネットワークインタフェース３２０を含む。（複数の）他のインタフェースは、ユーザインタフェース３１８、及び周辺デバイスインタフェース３２２を含む。（複数の）インタフェース３０６は、また、１以上のユーザインタフェース素子３１８を含むこともできる。（複数の）インタフェース３０６は、また、プリンタ、ポインティングデバイス（マウス、トラックパッドなど）、キーボードなどのためのインタフェースなど、１以上の周辺インタフェースを含むこともできる。
【０１０８】
バス３１２は、（複数の）プロセッサ３０２、（複数の）メモリデバイス３０４、（複数の）インタフェース３０６、（複数の）大容量ストレージデバイス３０８、及び（複数の）Ｉ／Ｏデバイス３１０が、バス３１２に結合された他のデバイス又はコンポーネントと共に、相互に通信可能とする。バス３１２は、システムバス、ＰＣＩバス、ＩＥＥＥ１３９４バス、ＵＳＢバスなどの幾つかの種類のバス構造の１以上を表す。
【０１０９】
図示のために、プログラム及び他の実行可能なプログラムコンポーネントが、個別のブロックとしてここに示されるが、もっとも、そのようなプログラム及びコンポーネントは、様々な時点で、コンピューティングデバイス３００の異なるストレージコンポーネントに常駐し、（複数の）プロセッサ３０２によって実行されることが可能であることは理解される。あるいは、本明細書で記述したシステム及びプロシジャーは、ハードウェア、又は、ハードウェア、ソフトウェア、及び／もしくはファームウェアの組み合わせによって実装されることができる。例えば、１以上の特定用途向け集積回路（ＡＳＩＣ）は、本明細書で記述したシステム及びプロシジャーの１以上を実行するためにプログラムされることができる。
【０１１０】
本発明は、その趣旨又は本質的な特性から逸脱することなく、他の特定の形態で実装されることができる。記述された実施形態は、あらゆる意味で、例示としてのみであり、限定ではないと考えられるべきである。本発明の範囲は、従って、上記説明によってではなく、添付の請求項によって示される。請求項の均等の意味及び範囲内に来るすべての変更は、それらの範囲内に含まれるべきである。
【図１】
2017199370.tif 000014
【図２Ａ】
2017199370.tif 000015
【図２Ｂ】
2017199370.tif 000016
【図２Ｃ】
2017199370.tif 000017
【図２Ｄ】
2017199370.tif 000018
【図２Ｅ】
2017199370.tif 000019
【図２Ｆ】
2017199370.tif 000020
【図３】
2017199370.tif 000021