(57)【特許請求の範囲】
【請求項１】
式（１）の様にθに相当する数字はコンピュータ上で０、または１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数１】
0004192547.tif 000037
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ１と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ２と、
ステップＳ２でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ３と、
ステップＳ３でのＩの更新後、メモリ上のビットｑIを読み出し、ｑIが１であるかどうかを判定するステップＳ４と、
ステップＳ４でｑIが１の場合に限り、メモリに保持されたｔａｎ（２I）、ｃｏｓ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（２）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ２に戻るステップＳ５と、
式（２）
Ｘ＝Ｘ−Ｙｔａｎ（２I）
Ｙ＝Ｙ＋Ｘｔａｎ（２I）
Ｚ＝Ｚｃｏｓ（２I）
ステップＳ４でｑI＝０であると判定された場合、ステップＳ２に戻るステップとステップＳ２で、Ｉ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（３）
ｃｏｓθ＝Ｘ×Ｚ
ｓｉｎθ＝Ｙ×Ｚ
により、三角関数の正弦値および余弦値を求めるステップＳ６とを加算器および乗算器を含む回路で実行する事により、任意の引数からその三角関数の値を抽出する演算方法。
【請求項２】
式（７）の様にθに相当する数字はコンピュータ上で０、または１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数２】
0004192547.tif 000038
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ７と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ８と、
ステップＳ８で、Ｉが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ９と、
ステップＳ９でのＩの更新後、メモリ上のビットｑIを読み出し、ｑIが１であるかどうかを判定するステップＳ１０と、
ステップＳ１０でｑIが１の場合に限り、メモリに保持されたｔａｎｈ（２I）、ｃｏｓｈ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（８）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ８に戻るステップＳ１１と、
式（８）
Ｘ＝Ｘ＋Ｙｔａｎｈ（２I）
Ｙ＝Ｙ＋Ｘｔａｎｈ（２I）
Ｚ＝Ｚｃｏｓｈ（２I）
ステップＳ１０で、ｑI＝０であると判定された場合、ステップＳ８に戻るステップとステップＳ８で、Ｉ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（９）
ｃｏｓｈθ＝Ｘ×Ｚ
ｓｉｎｈθ＝Ｙ×Ｚ
により、双曲線関数の正弦値および余弦値を求めるステップＳ１２とを加算器および乗算器を含む回路で実行する事より、任意の引数からその双曲線関数の値を抽出する演算方法。
【請求項３】
式（７）の様にθに相当する数字はコンピュータ上で０、または１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数３】
0004192547.tif 000039
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ１３と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ１４と、
ステップＳ１４でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ１５と、
ステップＳ１５でのＩの更新後、メモリ上のビットｑIを読み出し、メモリに保持されたｔａｎ（２I）、ｃｏｓ（２I）を使って、式（８）で与えられる加算器および乗算器を含む回路上の演算でＸ、Ｙ，Ｚの値を更新し、更新後ステップＳ１４に戻るステップＳ１６と、
式（８）
Ｘ＝Ｘ−ｑI＊Ｙ＊ｔａｎ（２I）
Ｙ＝Ｙ＋ｑI＊Ｘ＊ｔａｎ（２I）
Ｚ＝Ｚ［（１−ｑI）＋ｑI＊ｃｏｓ（２I）］
ステップＳ１４で、Ｉ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（９）
ｃｏｓθ＝Ｘ×Ｚ
ｓｉｎθ＝Ｙ×Ｚ
により、三角関数の正弦値および余弦値を求めるステップＳ１７とを加算器および乗算器を含む回路で実行する事により、任意の引数からその三角関数の値を抽出する演算方法。
【請求項４】
式（１０）の様にθに相当する数字はコンピュータ上で０、または１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数４】
0004192547.tif 000040
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ１８と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ１９と、
ステップＳ１９でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ２０と、
ステップＳ２０でのＩの更新後、メモリ上のビットｑIを読み出し、メモリに保持されたｔａｎｈ（２I）、ｃｏｓｈ（２I）を使って、式（１１）で与えられる加算器および乗算器を含む回路上の演算でＸ、Ｙ，Ｚの値を更新し、更新後ステップＳ１９に戻るステップＳ２１と、
式（１１）
Ｘ＝Ｘ＋ｑI＊Ｙ＊ｔａｎｈ（２I）
Ｙ＝Ｙ＋ｑI＊Ｘ＊ｔａｎｈ（２I）
Ｚ＝Ｚ［（１−ｑI）＋ｑI＊ｃｏｓｈ（２I）］
ステップＳ１９で、Ｉ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（１２）
ｃｏｓｈθ＝Ｘ×Ｚ
ｓｉｎｈθ＝Ｙ×Ｚ
により、双曲線関数の正弦値および余弦値を求めるステップＳ２２とを加算器および乗算器を含む回路で実行する事より、任意の引数からその双曲線関数の値を抽出する演算方法。
【請求項５】
式（１３）の様にθに相当する数字はコンピュータ上で０、１、−１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数５】
0004192547.tif 000041
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ２３と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ２４と、
ステップＳ２４でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ２５と、
ステップＳ２５でのＩの更新後、メモリ上のビットｑIを読み出し、ｑIが１、０、−１のどれであるかどうかを判定するステップＳ２６と、
ステップＳ２６でｑIが１であると判定された場合、メモリに保持されたｔａｎ（２I）、ｃｏｓ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（１４）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ２４に戻るステップＳ２７と、
式（１４）
Ｘ＝Ｘ−Ｙｔａｎ（２I）
Ｙ＝Ｙ＋Ｘｔａｎ（２I）
Ｚ＝Ｚｃｏｓ（２I）
ステップＳ２６でｑIが−１であると判定された場合、メモリに保持されたｔａｎ（２I）、ｃｏｓ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（１５）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ２４に戻るステップＳ２８と、
式（１５）
Ｘ＝Ｘ＋Ｙｔａｎ（２I）
Ｙ＝Ｙ−Ｘｔａｎ（２I）
Ｚ＝Ｚｃｏｓ（２I）］
ステップＳ２６でｑI＝０と判定された場合、ステップＳ２４に戻るステップとステップＳ２４でＩ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（１６）
ｃｏｓθ＝Ｘ×Ｚ
ｓｉｎθ＝Ｙ×Ｚ
により、三角関数の正弦値および余弦値を求めるステップＳ２９とを加算器および乗算器を含む回路で実行する事により、任意の引数からその三角関数の値を抽出する演算方法。
【請求項６】
式（１７）の様にθに相当する数字はコンピュータ上で０、１、−１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数６】
0004192547.tif 000042
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ３０と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ３１と、
ステップＳ３１でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ３２と、
ステップＳ３２でのＩの更新後、メモリ上のビットｑIを読み出し、ｑIが１、０、−１のどれであるかどうかを判定するステップＳ３３と、
ステップＳ３３でｑIが１であると判定された場合、メモリに保持されたｔａｎｈ（２I）、ｃｏｓｈ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（１８）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ３１に戻るステップＳ３４と、
式（１８）
Ｘ＝Ｘ−Ｙｔａｎｈ（２I）
Ｙ＝Ｙ＋Ｘｔａｎｈ（２I）
Ｚ＝Ｚｃｏｓｈ（２I）
ステップＳ３３でｑIが−１であると判定された場合、メモリに保持されたｔａｎｈ（２I）、ｃｏｓｈ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（１９）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ３１に戻るステップＳ３５と、
式（１９）
Ｘ＝Ｘ−Ｙｔａｎｈ（２I）
Ｙ＝Ｙ−Ｘｔａｎｈ（２I）
Ｚ＝Ｚｃｏｓｈ（２I）］
ステップＳ３３でｑI＝０と判定された場合、ステップＳ３１に戻るステップとステップＳ３１でＩ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（２０）
ｃｏｓｈθ＝Ｘ×Ｚ
ｓｉｎｈθ＝Ｙ×Ｚ
により、双曲線関数の正弦値および余弦値を求めるステップＳ３６とを加算器および乗算器を含む回路で実行する事より、任意の引数からその双曲線関数の値を抽出する演算方法。
【請求項７】
式（２１）の様にθに相当する数字はコンピュータ上で０、１、−１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数７】
0004192547.tif 000043
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ３７と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ３８と、
ステップＳ３８でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ３９と、
ステップＳ３９でのＩの更新後、メモリ上のビットｑIを読み出し、メモリに保持されたｔａｎ（２I）、ｃｏｓ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（２２）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ３８に戻るステップＳ４０と、
式（２２）
Ｘ＝Ｘ−ｑI＊Ｙ＊ｔａｎ（２I）
Ｙ＝Ｙ＋ｑI＊Ｘ＊ｔａｎ（２I）
Ｚ＝Ｚ［１−ｑI2＋ｑI2ｃｏｓ（２I）］
ステップＳ３８でＩ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（２３）
ｃｏｓθ＝Ｘ×Ｚ
ｓｉｎθ＝Ｙ×Ｚ
により、三角関数の正弦値および余弦値を求めるステップＳ４１とを加算器および乗算器を含む回路で実行する事により、任意の引数からその三角関数の値を抽出する演算方法。
【請求項８】
式（２４）の様にθに相当する数字はコンピュータ上で０、１、−１の値をとるｑｊの組み合わせでメモリ上に保持されているものとし、
【数８】
0004192547.tif 000044
コンピュータのプログラム上でθを構成するビットの桁をあらわすインデックスを変数Ｉとし、最下位桁をＩ＝Ｎとして、Ｉ＝Ｎ−１、Ｘ＝１、Ｚ＝１、Ｙ＝０をメモリ上にセットするステップＳ４２と、
Ｉの値が最上位桁Ｍに到達したか否かを判定するステップＳ４３と、
ステップＳ４３でＩが最上位の桁でないと演算装置上で判定された場合、メモリ上で変数ＩをＩ＝Ｉ＋１と更新するステップＳ４４と、
ステップＳ４４でのＩの更新後、メモリ上のビットｑIを読み出し、メモリに保持されたｔａｎｈ（２I）、ｃｏｓｈ（２I）を使って、Ｘ、Ｙ、Ｚの値を式（２５）で与えられる加算器および乗算器を含む回路上の演算で更新し、更新後ステップＳ４３に戻るステップＳ４５と、
式（２５）
Ｘ＝Ｘ＋ｑI＊Ｙ＊ｔａｎｈ（２I）
Ｙ＝Ｙ＋ｑI＊Ｘ＊ｔａｎｈ（２I）
Ｚ＝Ｚ［１−ｑI2＋ｑI2ｃｏｓｈ（２I）］
ステップＳ４３でＩ＝Ｍとなりビットの桁が最高桁に達したと判定された場合、
式（２３）
ｃｏｓｈθ＝Ｘ×Ｚ
ｓｉｎｈθ＝Ｙ×Ｚ
により、双曲線関数の正弦値および余弦値を求めるステップＳ４６とを加算器および乗算器を含む回路で実行する事により、任意の引数からその双曲線関数の値を抽出する演算方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、三角関数や双曲線関数等の関数の計算を行うための演算方法及び装置、プログラム並びに記録媒体に関するものである。
【０００２】
【従来の技術】
近年、Ｃ言語、ＶＨＤＬまたはverilogなどの回路記述言語により、アルゴリズムの回路化、即ちアルゴリズムに沿って動作し、関数等の計算を行う回路を生成することができるようになった。これにより、計算速度の向上が可能となった。
【０００３】
例えば、三角関数は、ゲーム機器で画面のグラフィックを動かす時などに頻繁に行われている３次元映像を２次元映像面へ投影するような計算において重要とされている。高速で三角関数を計算するアルゴリズムと、それを回路化することにより、より早いスピードで３Ｄ画面等を動かすことができ、ゲームのリアル感を向上することができる。
【０００４】
従来の三角関数の計算アルゴリズムとして反復計算を利用するものがある。以下に、従来の反復計算を用いた三角関数の計算法についての一例を示す。以下に示す方法は、ＣＯＲＤＩＣ法と呼ばれ、電卓等で実用化されているものである。ＣＯＲＤＩＣ法は、関数を２次元平面上のベクトルと捉えて、ベクトルの回転の反復計算によって関数値を求めるものである。小数点以下Ｎビットの精度でsin(θ)、cos(θ)の計算を行う場合、以下に示すX0、Y0、Z0の値を初期値とする。
【０００５】
【数１７】
0004192547.tif 000002
【０００６】
このとき、下記の漸化式をＮ＋１回反復する事で三角関数を計算することが出来る。
【０００７】
Xj = Xj-1-qj-1・2-(j-1)・Yj-1
Yj = Yj-1+qj-1・2-(j-1)・Xj-1
Zj = Zj-1-qj-1・tan-1(2-(j-1))
（qj-1 は、１、−１のうち、θ- Zj が０に近くなるものを選ぶ。）
【０００８】
図１４は、X = Xj、Y = Yj、Z = Zj として、従来の三角関数を計算する場合のアルゴリズムの一例である。このアルゴリズムは、引数θを下記のように示した場合の三角関数の計算アルゴリズムである。
【０００９】
【数１８】
0004192547.tif 000003
【００１０】
図１４中の変数Ｉは、読み出しを行っているビット位置のインデックスである。最下位桁（I=N）の場合、初期値として、I=-1、X=1、Y=0、Z=1、R=θ をそれぞれ代入する（ステップＳ１０１）。次に、I=M であるか否かが判定される（ステップＳ１０２）。ステップＳ１０２において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ１０８に進む。ステップＳ１０２において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ１０３に進む。
【００１１】
ステップＳ１０３では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて、RP = R-tan-1(2I)、RN = R+tan-1(2I)をそれぞれ計算する（ステップＳ１０４）。次に、|RP| ≦ |RN|であるか否かを判定する（ステップＳ１０５）。
【００１２】
ステップＳ１０５において、「Ｙｅｓ」すなわち、|RP| ≦ |RN| であると判定された場合には、ステップＳ１０６に進む。ステップＳ１０６では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。
【００１３】
X = X-2I・Y
Y = Y+2I・X
Z = Z(1+2I)
【００１４】
ステップＳ１０６においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ１０２に戻る。
【００１５】
ステップＳ１０５において、「Ｎｏ」すなわち、|RP| ≦ |RN|でないと判定された場合には、ステップＳ１０７に進む。ステップＳ１０７では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。
【００１６】
X = X+2I・Y
Y = Y-2I・X
Z = Z(1+2I)
【００１７】
ステップＳ１０７においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ１０２に戻る。
【００１８】
ステップＳ１０８では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【００１９】
【数１９】
0004192547.tif 000004
【００２０】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ１０１〜ステップＳ１０８で求まったsin(θ) 、cos(θ)から計算する。
【００２１】
また、双曲線関数も三角関数と同様な考え方で反復計算を用いて計算を行うことができる。図１５は、従来の双曲線関数を計算する場合のアルゴリズムの一例である。最下位桁（I=N）の場合、初期値として、I=-1、X=1、Y=0、Z=1、R=θ をそれぞれ代入する（ステップＳ１０９）。次に、I=M であるか否かが判定される（ステップＳ１１０）。ステップＳ１１０において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ１１６に進む。ステップＳ１１０において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ１１１に進む。
【００２２】
ステップＳ１１１では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて、RP = R-tanh-1(2I)、RN = R+tanh-1(2I)をそれぞれ計算する（ステップＳ１１２）。次に、|RP| ≦ |RN|であるか否かを判定する（ステップＳ１１３）。
【００２３】
ステップＳ１１３において、「Ｙｅｓ」すなわち、|RP| ≦ |RN| であると判定された場合には、ステップＳ１１４に進む。ステップＳ１１４では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。
【００２４】
X = X+2I・Y
Y = Y+2I・X
Z = Z(2I-1)
【００２５】
ステップＳ１１４においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ１１０に戻る。
【００２６】
ステップＳ１１３において、「Ｎｏ」すなわち、|RP| ≦ |RN|でないと判定された場合には、ステップＳ１１５に進む。ステップＳ１１５では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。
【００２７】
X = X-2I・Y
Y = Y-2I・X
Z = Z(2I-1)
【００２８】
ステップＳ１０７においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ１０２に戻る。
【００２９】
ステップＳ１０８では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【００３０】
【数２０】
0004192547.tif 000005
【００３１】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ１０９〜ステップＳ１１６で求まったsinh(θ) 、cosh(θ)から計算する。
【００３２】
【発明が解決しようとする課題】
しかしながら、上述したような従来の計算アルゴリズムでは、計算の遅い割り算及び、平方根演算等を含む為、除算器の導入や専用回路の導入によるコストの増加、除算を加算器や乗算器で代替する事による計算時間の増大等を招くという問題がある。
【００３３】
そこで近年、除算、平方根演算を伴わないように、三角関数もしくは双曲線関数の引数θを、下記の式に示す様に、２進数で展開し(qj = 0，1又は、qj = 0，±1)、これにオイラーの法則を適用する事で、除算を行うことなく、これらの関数の抽出を実現するアルゴリズムが特願２００１−２９４４０２に提案されている。
【００３４】
【数２１】
0004192547.tif 000006
【００３５】
このアルゴリズムでは、除算や、平方根計算が必要ない上、統計的には、各桁のビットが「0」または「1」を取る確率は1/2である為、平均すると計算に要する反復計算の回数がＣＯＲＤＩＣ法に比べ半分程度で済むというメリットがある。しかしながら、ＣＯＲＤＩＣ法では計算に表れる乗算は、例えば、2-(j-1) Yj-1 のようにビットシフトのみで済むのに対し、このアルゴリズムではcos(2j)やsin(2j)等との積を含む為、1回辺りの反復計算に要する時間については長くなる事が予想される。
【００３６】
【００３７】
したがって、この発明の目的は、計算速度を向上し、且つ計算回路等のコストをかけずに、三角関数や双曲線関数等の関数を計算できる演算方法及び装置、プログラム並びに記録媒体を提供することにある。
【００３８】
【課題を解決するための手段】
上述した課題を解決するために、請求項１の発明は、
三角関数の正弦値と余弦値とを演算する演算方法において、
下記の式（６１）および式（６２）に示すように、余弦値をXMとし、正弦値をYMとし、引数を級数の和で表現する。
【００３９】
【数２２】
0004192547.tif 000007
【数２３】
0004192547.tif 000008
Zj=cos(ｆj)×Zj-1、Xj=xj×Zj、Yj=yj×Zjと置き、三角関数の加法定理により上記の式（６１）および式（６２）をそれぞれ変形した下記の式（６３）および式（６４）と、式（６５）とからなる漸化式をそれぞれ反復計算する。
【００４０】
xj=xj-1-tan(ｆj)×yj-1      ・・・（６３）
yj=yj-1+tan(ｆj)×xj-1      ・・・（６４）
Zj=Zj-1×cos(ｆj)          ・・・（６５）
(j=N,N+1,…,M-1,M(M≧N)、初期値：xN-1=1、yN-1=0、ZN-1=1)
上記の式（６３）〜式（６５）で求められたxM、yMおよびZMから下記の式（６６）および式（６７）により余弦値XM、正弦値YM を計算する
ことを特徴とする演算方法である。
【００４１】
XM=xM×ZM      ・・・（６６）
YM=yM×ZM      ・・・（６７）
【００４２】
請求項８の発明は、
双曲線関数の正弦値と余弦値とを演算する演算方法において、
下記の式（６８）および式（６９）に示すように、余弦値をXMとし、正弦値をYMとし、引数を級数の和で表現する。
【００４３】
【数２４】
0004192547.tif 000009
【数２５】
0004192547.tif 000010
Zj=cosh(ｆj)×Zj-1、Xj=xj×Zj、Yj=yj×Zjと置き、双曲線関数の加法定理により上記の式（６８）および式（６９）をそれぞれ変形した下記の式（７０）および式（７１）と、式（７２）とからなる漸化式をそれぞれ反復計算する。
【００４４】
xj=xj-1+tanh(ｆj)×yj-1      ・・・（７０）
yj=yj-1+tanh(ｆj)×xj-1      ・・・（７１）
Zj=Zj-1×cosh(ｆj)          ・・・（７２）
(j=N,N+1,…,M-1,M(M≧N)、初期値：xN-1=1、yN-1=0、ZN-1=1)
上記の式（７０）〜式（７２）で求められたxM、yMおよびZMから下記の式（７３）および式（７４）により余弦値XM、正弦値YM を計算する
ことを特徴とする演算方法である。
【００４５】
XM=xM×ZM      ・・・（７３）
YM=yM×ZM      ・・・（７４）
【００４６】
この発明では、三角関数や双曲線関数等の引数を級数の和に展開し、加法定理を利用して除算、平方根計算を含まない形に変形した漸化式を反復計算することで、関数値の計算を行う。このため、計算回路等のコストをかけずに三角関数や双曲線関数等の関数の計算を高速に行うことができる。
【００４７】
【発明の実施形態】
まず、この発明の実施形態による三角関数および双曲線関数等の計算アルゴリズムについて説明する。三角関数の引数部を級数の和(以後、以下のように書く)で表す。
【００４８】
【数２６】
0004192547.tif 000011
【００４９】
これにより、三角関数の加法定理が利用出来るようになり、数学的に厳密な三角関数の計算法を導出することが出来る。
【００５０】
ここで、下記に示すθを引数とする三角関数について考察する。
【００５１】
【数２７】
0004192547.tif 000012
【００５２】
これにより、以下の様に関数が定義される。
【００５３】
【数２８】
0004192547.tif 000013
【００５４】
したがって、三角関数の加法定理から次の様な関係が成り立つ。
【００５５】
【数２９】
0004192547.tif 000014
【００５６】
ここで、Xj = xj・Zj 、Yj = yj・Zj 、Zj = cos(ｆj)・Zj-1 と置き、Xj、Yj を Zjで割ると、三角関数は次の関係を満たす。
【００５７】
xj = xj-1-tan(fj)・yj-1
yj = yj-1+tan(fj)・xj-1
Zj = Zj-1・cos(fj)
j=N、N+1、…、M-1、M（N≦M）
【００５８】
そして、下記の式を満たすθを基に、cos(θ)、sin(θ)を計算する場合、xN-1 = 1、yN-1 = 0、ZN-1 = 1 を初期値として、漸化式を反復計算し、xM、yM、ZM を求め、それを基に関係式cos(θ)= XM = xM・ZM、sin(θ)= YM = yM・ZM を使って、cos(θ)、sin(θ)を求めればよい。
【００５９】
【数３０】
0004192547.tif 000015
【００６０】
双曲線関数も同様に、加法定理を利用すると、次の漸化式を満たすのが判る。
【００６１】
xj = xj-1+tanh(fj)・yj-1
yj = yj-1+tanh(fj)・xj-1
Zj = Zj-1・cosh(fj)
j=N、N+1、…、M-1、M（N≦M）
【００６２】
そして、下記の式を満たすθを基に、cosh(θ)、sinh(θ)を計算する場合、xN-1 = 1、yN-1 = 0、ZN-1 = 1 を初期値として、漸化式を反復計算し、xM、yM、ZMを求め、それを基に関係式cosh(θ)= xM・ZM、sinh(θ)= yM・ZM を使って、cosh(θ)、sinh(θ)を求めればよい。
【００６３】
【数３１】
0004192547.tif 000016
【００６４】
第１の実施形態
以下に、fi = qi・2i(qi = 0,1)と置いた時の、三角関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、三角関数の引数θを２進数で表現した事と一致する。（qi がビット値に相当する。）
【００６５】
【数３２】
0004192547.tif 000017
【００６６】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【００６７】
xj = xj-1-tan(qj・2j)・yj-1 = xj-1-qj・tan(2j)・yj-1
yj = yj-1+tan(qj・2j)・xj-1 = yj-1+qj・tan(2j)・xj-1
Zj = Zj-1・cos(qj・2j) = Zj-1[(1-qj)+qj・cos(2j)]
j=N、N+1、…、M-1、M(M≧N)
【００６８】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【００６９】
cos(θ) = xM・ZM
sin(θ) = yM・ZM
【００７０】
さらに、θの各桁のビット値で場合分けを行うと、漸化式は次の様に書きなおせる。
【００７１】
qj = 0 の場合、以下のようになる。
【００７２】
xj = xj-1
yj = yj-1
Zj = Zj-1
【００７３】
qj = 1 の場合、以下のようになる。
【００７４】
xj = xj-1-tan(2j)・yj-1
yj = yj-1+tan(2j)・xj-1
Zj = Zj-1・cos(2j)
【００７５】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図１に示す。
【００７６】
【数３３】
0004192547.tif 000018
【００７７】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁（I=N）の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ１）。次に、I=M であるか否かが判定される（ステップＳ２）。ステップＳ２において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ６に進む。ステップＳ２において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ３に進む。
【００７８】
ステップＳ３では、変数Ｉをインクリメント、すなわち、I=I+１ とし、続いてqI の値を読み出し、qI = 1 であるか否かが判定される（ステップＳ４）。ステップＳ４において、「Ｎｏ」すなわち、qI = 1 でない（qI = 0 ）と判定された場合には、ステップＳ２に戻る。ステップＳ４において、「Ｙｅｓ」すなわち、qI = 1 であると判定された場合には、ステップＳ５に進む。ステップＳ５では、以下の計算を行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【００７９】
W = X-tan(2I)・Y
Y = Y+tan(2I)・X
X = W
Z = Z・cos(2I)
【００８０】
ステップＳ５においてX、Y、Zの値を更新後、ステップＳ２に戻る。
【００８１】
ステップＳ６では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【００８２】
cos(θ) = X・Z
sin(θ) = Y・Z
【００８３】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ１〜ステップＳ６で求まったsin(θ) 、cos(θ)から計算する。
【００８４】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【００８５】
第２の実施形態
以下に、fi = qi・2i(qi = 0,1)と置いた時の、双曲線関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、双曲線関数の引数を２進数で表現した事と一致する。（qi がビット値に相当する。）
【００８６】
【数３４】
0004192547.tif 000019
【００８７】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【００８８】
xj = xj-1+tanh(qj・2j)・yj-1 = xj-1+qj・tanh(2j)・yj-1
yj = yj-1+tanh(qj・2j)・xj-1 = yj-1+qj・tanh(2j)・xj-1
Zj = Zj-1・cosh(qj・2j) = Zj-1[(1-qj)+qj・cosh(2j)]
j=N、N+1、…、M-1、M(M≧N)
【００８９】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【００９０】
cosh(θ) = xM・ZM
sinh(θ) = yM・ZM
【００９１】
さらに、θの各桁のビット値で場合分けを行うと、漸化式は次の様に書きなおせる。
【００９２】
qj = 0 の場合、以下のようになる。
【００９３】
xj = xj-1
yj = yj-1
Zj = Zj-1
【００９４】
qj = 1 の場合、以下のようになる。
【００９５】
xj = xj-1+tanh(2j)・yj-1
yj = yj-1+tanh(2j)・xj-1
Zj = Zj-1・cosh(2j)
【００９６】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図２に示す。
【００９７】
【数３５】
0004192547.tif 000020
【００９８】
変数Ｉは、読み出しを行っているビット位置のインデックスである。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ７）。次に、I=M であるか否かが判定される（ステップＳ８）。ステップＳ８において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ１２に進む。ステップＳ８において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ９に進む。
【００９９】
ステップＳ９では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いてqI の値を読み出し、qI = 1 であるか否かが判定される（ステップＳ１０）。ステップＳ１０において、「Ｎｏ」すなわち、qI = 1 でない（qI = 0 ）と判定された場合には、ステップＳ８に戻る。ステップＳ１０において、「Ｙｅｓ」すなわち、qI = 1 であると判定された場合には、ステップＳ１１に進む。ステップＳ１１では、以下の計算を行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１００】
W = X+tanh(2I)・Y
Y = Y+tanh(2I)・X
X = W
Z = Z・cosh(2I)
【０１０１】
ステップＳ１１においてX、Y、Zの値を更新後、ステップＳ８に戻る。
【０１０２】
ステップＳ１２では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０１０３】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０１０４】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ７〜ステップＳ１２で求まったsinh(θ) 、cosh(θ)から計算する。
【０１０５】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０１０６】
第３の実施形態
近年のコンピュータに積載されるＭＰＵ（MicroProcessing Unit）は、計算を流れ作業的に実行する為の深いパイプラインを持つ。これらのＭＰＵは、流れ作業の中にプログラムの条件分岐が含まれる場合、それ以降の命令を破棄する必要が出てくる為、計算効率が低下してしまう。通常はこれを回避する為、予め分岐予測を行って、情報分岐後の計算も流れ作業で計算してしまうが、分岐予測が外れた場合、ペナルティが発生し、結果として計算が遅くなるという問題が発生する。
【０１０７】
三角関数の引数のビット値による条件分岐を行うアルゴリズムを採用した場合、引数の各桁のビット値は完全に同じ確率で「0」又は「１」の値をとり、ビット値の表れ方もランダムであると考えられる為、ビット値による条件分岐を含まない事が望ましい。
【０１０８】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図３に示す。
【０１０９】
【数３６】
0004192547.tif 000021
【０１１０】
変数Ｉは、読み出しを行っているビット位置のインデックスである。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ１３）。次に、I=M であるか否かが判定される（ステップＳ１４）。ステップ１４において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ１７に進む。ステップＳ１４において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ１５に進む。
【０１１１】
ステップＳ１５では、変数Ｉをインクリメント、すなわち、I=I+1 とし、qI の値を読み出す。次に、ステップＳ１６において、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１１２】
W = X-qI・tan(2I)・Y
Y = Y+qI・tan(2I)・X
Z = Z[(1-qI)+qI・cos(2I)]
X = W
【０１１３】
ステップＳ３０においてX、Y、Zの値を更新後、ステップＳ１４に戻る。
【０１１４】
ステップＳ１７では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【０１１５】
cos(θ) = X・Z
sin(θ) = Y・Z
【０１１６】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ１３〜ステップＳ１７で求まったsin(θ) 、cos(θ)から計算する。
【０１１７】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０１１８】
また、計算の過程で条件分岐を含まない為（ステップＳ１４における条件分岐の実体は、反復ループ計算なので、パイプラインの分岐予測エラーによるペナルティにはかからない）、条件予測付きパイプラインを含むＭＰＵで分岐予測エラーを伴うことなく、計算を実行することができる。
【０１１９】
第４の実施形態
以下に、情報分岐を含まずに双曲線関数を計算するアルゴリズムについて示す。X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図４に示す。
【０１２０】
【数３７】
0004192547.tif 000022
【０１２１】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ１８）。次に、I=M であるか否かが判定される（ステップＳ１９）。ステップ１９において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ２２に進む。ステップＳ１９において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ２０に進む。
【０１２２】
ステップＳ２０では、変数Ｉをインクリメント、すなわち、I=I+1 とし、qI の値を読み出す。次に、ステップＳ２１において、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１２３】
W = X+qI・tanh(2I)・Y
Y = Y+qI・tanh(2I)・X
Z = Z[(1-qI)+qI・cosh(2I)]
X = W
【０１２４】
ステップＳ２１においてX、Y、Zの値を更新後、ステップＳ１９に戻る。
【０１２５】
ステップＳ２２では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０１２６】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０１２７】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ１８〜ステップＳ２２で求まったsinh(θ) 、cosh(θ)から計算する。
【０１２８】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０１２９】
また、計算の過程で条件分岐を含まない為（ステップＳ１９における条件分岐の実体は、反復ループ計算なので、パイプラインの分岐予測エラーによるペナルティにはかからない）、条件予測付きパイプラインを含むＭＰＵで分岐予測エラーを伴うことなく、計算を実行することができる。
【０１３０】
第５の実施形態
第１の実施形態では、三角関数の引数が単純に２進数で表される場合のアルゴリズムについて説明したが、計算機の中では暫し、数字を0,1のビットの代わりに、冗長性を持った、-1、0、1の組み合わせで表す事がある。例えば、２進数で01111という数は、10000-00001に等価である為、1000-1と最下位ビットが-1の形で書ける。
【０１３１】
以下に、fi = qi・2i(qi = 0,±1)と置いた時の、三角関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、三角関数の引数を２進数で表現した事と一致する。（qi がビット値に相当する。）
【０１３２】
【数３８】
0004192547.tif 000023
【０１３３】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【０１３４】
xj = xj-1-tan(qj・2j)・yj-1 = xj-1-qj・tan(2j)・yj-1
yj = yj-1+tan(qj・2j)・xj-1 = yj-1+qj・tan(2j)・xj-1
Zj = Zj-1・cos(qj・2j) = Zj-1[(1-qj2)+qj2・cos(2j)]
j=N、N+1、…、M-1、M(M≧N)
【０１３５】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【０１３６】
cos(θ) = xM・ZM
sin(θ) = yM・ZM
【０１３７】
さらに、θの各桁のビット値で場合分けを行うと、漸化式は次の様に書きなおせる。
【０１３８】
qj = 0 の場合、以下のようになる。
【０１３９】
xj = xj-1
yj = yj-1
Zj = Zj-1
【０１４０】
qj = 1 の場合、以下のようになる。
【０１４１】
xj = xj-1-tan(2j)・yj-1
yj = yj-1+tan(2j)・xj-1
Zj = Zj-1・cos(2j)
【０１４２】
qj = -1 の場合、以下のようになる。
【０１４３】
xj = xj-1+tan(2j)・yj-1
yj = yj-1-tan(2j)・xj-1
Zj = Zj-1・cos(2j)
【０１４４】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図５に示す。
【０１４５】
【数３９】
0004192547.tif 000024
【０１４６】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ２３）。次に、I=M であるか否かが判定される（ステップＳ２４）。ステップ２４において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ２９に進む。ステップＳ２４において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ２５に進む。
【０１４７】
ステップＳ２５では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いてqI の値を読み出す（ステップＳ２６）。ステップＳ２６で読み出した結果が、qI = 0 のときには、ステップＳ２４に戻る。
【０１４８】
ステップＳ２６で読み出した結果が、qI = 1 のときには、ステップＳ２７に進む。ステップＳ２７では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１４９】
W = X-tan(2I)・Y
Y = Y+tan(2I)・X
X = W
Z = Z・cos(2I)
【０１５０】
ステップＳ２７においてX、Y、Zの値を更新後、ステップＳ２４に戻る。
【０１５１】
ステップＳ２６で読み出した結果が、qI = -1 のときには、ステップＳ２８に進む。ステップＳ２８では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１５２】
W = X+tan(2I)・Y
Y = Y-tan(2I)・X
X = W
Z = Z・cos(2I)
【０１５３】
ステップＳ２８においてX、Y、Zの値を更新後、ステップＳ２４に戻る。
【０１５４】
ステップＳ２９では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【０１５５】
cos(θ) = X・Z
sin(θ) = Y・Z
【０１５６】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ２３〜ステップＳ２９で求まったsin(θ) 、cos(θ)から計算する。
【０１５７】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０１５８】
更に、冗長表現では、通常の２進数表現に比べ、ビット値がゼロになる桁数が多くなる為、第１の実施形態よりも漸化式を解く反復回数が少なくなり、高速化が可能である。
【０１５９】
第６の実施形態
第２の実施形態では、双曲線関数の引数が単純に２進数で表される場合のアルゴリズムについて説明したが、計算機の中では暫し、数字を0,1のビットの代わりに、冗長性を持った、-1、0、1の組み合わせで表す事がある。例えば、２進数で01111という数は、10000-00001に等価である為、1000-1と最下位ビットが-1の形で書ける。
【０１６０】
以下に、fi = qi・2i(qi = 0,±1)と置いた時の、双曲線関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、双曲線関数の引数を２進数で表現した事と一致する。（qi がビット値に相当する。）
【０１６１】
【数４０】
0004192547.tif 000025
【０１６２】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【０１６３】
xj = xj-1+tanh(qj・2j)・yj-1 = xj-1+qj・tanh(2j)・yj-1
yj = yj-1+tanh(qj・2j)・xj-1 = yj-1+qj・tanh(2j)・xj-1
Zj = Zj-1・cosh(qj・2j) = Zj-1[(1-qj2)+qj2・cosh(2j)]
j=N、N+1、…、M-1、M(M≧N)
【０１６４】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【０１６５】
cosh(θ) = xM・ZM
sinh(θ) = yM・ZM
【０１６６】
さらに、θの各桁のビット値で場合分けを行うと、漸化式は次の様に書きなおせる。
【０１６７】
qj = 0 の場合、以下のようになる。
【０１６８】
xj = xj-1
yj = yj-1
Zj = Zj-1
【０１６９】
qj = 1 の場合、以下のようになる。
【０１７０】
xj = xj-1+tanh(2j)・yj-1
yj = yj-1+tanh(2j)・xj-1
Zj = Zj-1・cosh(2j)
【０１７１】
qj = -1 の場合、以下のようになる。
【０１７２】
xj = xj-1-tanh(2j)・yj-1
yj = yj-1-tanh(2j)・xj-1
Zj = Zj-1・cosh(2j)
【０１７３】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図６に示す。
【０１７４】
【数４１】
0004192547.tif 000026
【０１７５】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ３０）。次に、I=M であるか否かが判定される（ステップＳ３１）。ステップ３１において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ３６に進む。ステップＳ３１において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ３２に進む。
【０１７６】
ステップＳ３２では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いてqI の値を読み出す（ステップＳ３３）。ステップＳ３３で読み出した結果が、qI = 0 のときには、ステップＳ３１に戻る。
【０１７７】
ステップＳ３３で読み出した結果が、qI = 1 のときには、ステップＳ３４に進む。ステップＳ３４では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１７８】
W = X+tanh(2I)・Y
Y = Y+tanh(2I)・X
X = W
Z = Z・cosh(2I)
【０１７９】
ステップＳ３４においてX、Y、Zの値を更新後、ステップＳ３１に戻る。
【０１８０】
ステップＳ３３で読み出した結果が、qI = -1 のときには、ステップＳ３５に進む。ステップＳ３５では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１８１】
W = X-tanh(2I)・Y
Y = Y-tanh(2I)・X
X = W
Z = Z・cosh(2I)
【０１８２】
ステップＳ３５においてX、Y、Zの値を更新後、ステップＳ３４に戻る。
【０１８３】
ステップＳ３６では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０１８４】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０１８５】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ３０〜ステップＳ３６で求まったsinh(θ) 、cosh(θ)から計算する。
【０１８６】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０１８７】
更に、冗長表現では、通常の２進数表現に比べ、ビット値がゼロになる桁数が多くなる為、第２の実施形態よりも漸化式を解く反復回数が少なくなり、高速化が可能である。
【０１８８】
第７の実施形態
以下に、fi = qi・2i(qi = 0,±1)と置いた時の、条件分岐のない三角関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、三角関数の引数を２進数で表現した事と一致する。（qi がビット値に相当する。）
【０１８９】
【数４２】
0004192547.tif 000027
【０１９０】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【０１９１】
xj = xj-1-tan(qj・2j)・yj-1 = xj-1-qj・tan(2j)・yj-1
yj = yj-1+tan(qj・2j)・xj-1 = yj-1+qj・tan(2j)・xj-1
Zj = Zj-1・cos(qj・2j) = Zj-1[(1-qj2)+qj2・cos(2j)]
j=N、N+1、…、M-1、M(M≧N)
【０１９２】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【０１９３】
cos(θ) = xM・ZM
sin(θ) = yM・ZM
【０１９４】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図７に示す。
【０１９５】
【数４３】
0004192547.tif 000028
【０１９６】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ３７）。次に、I=M であるか否かが判定される（ステップＳ３８）。ステップ３８において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ４１に進む。ステップＳ３８において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ３９に進む。
【０１９７】
ステップＳ３９では、変数Ｉをインクリメント、すなわち、I=I+1 とし、qI の値を読み出す。次に、ステップＳ４０において、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０１９８】
W = X-qI・tan(2I)・Y
Y = Y+qI・tan(2I)・X
X = W
Z = Z[(1-qI2)+qI2・cos(2I)]
【０１９９】
ステップＳ４０においてX、Y、Zの値を更新後、ステップＳ３８に戻る。
【０２００】
ステップＳ４１では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【０２０１】
cos(θ) = X・Z
sin(θ) = Y・Z
【０２０２】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ３７〜ステップＳ４１で求まったsin(θ) 、cos(θ)から計算する。
【０２０３】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０２０４】
更に、冗長表現では、通常の２進数表現に比べ、ビット値がゼロになる桁数が多くなる為、第１の実施形態よりも漸化式を解く反復回数が少なくなり、高速化が可能である。
【０２０５】
また、計算の過程で条件分岐を含まない為（ステップＳ３８における条件分岐の実体は、反復ループ計算なので、パイプラインの分岐予測エラーによるペナルティにはかからない）、条件予測付きパイプラインを含むＭＰＵで分岐予測エラーを伴うことなく、計算を実行することができる。
【０２０６】
第８の実施形態
以下に、fi = qi・2i(qi = 0,±1)と置いた時の、条件分岐のない双曲線関数の計算法について説明する。通常計算機上では、数字は２進数で表現される。よって、以下の式は、双曲線関数の引数を２進数で表現した事と一致する。（qi がビット値に相当する。）
【０２０７】
【数４４】
0004192547.tif 000029
【０２０８】
この場合、漸化式、漸化式の初期値は次の様に書ける。
【０２０９】
xj = xj-1+tanh(qj・2j)・yj-1 = xj-1+qj・tanh(2j)・yj-1
yj = yj-1+tanh(qj・2j)・xj-1 = yj-1+qj・tanh(2j)・xj-1
Zj = Zj-1・cosh(qj・2j) = Zj-1[(1-qj2)+qj2・cosh(2j)]
j=N、N+1、…、M-1、M(M≧N)
【０２１０】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
【０２１１】
cosh(θ) = xM・ZM
sinh(θ) = yM・ZM
【０２１２】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図８に示す。
【０２１３】
【数４５】
0004192547.tif 000030
【０２１４】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁がI=N の場合、初期値として、I=N-1、X=1、Z=1、Y=0 を代入する（ステップＳ４２）。次に、I=M であるか否かが判定される（ステップＳ４３）。ステップ４３において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ４６に進む。ステップＳ４３において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ４４に進む。
【０２１５】
ステップＳ４４では、変数Ｉをインクリメント、すなわち、I=I+1 とし、qI の値を読み出す。次に、ステップＳ４５において、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２１６】
W = X+qI・tanh(2I)・Y
Y = Y+qI・tanh(2I)・X
X = W
Z = Z[(1-qI2)+qI2・cosh(2I)]
【０２１７】
ステップＳ４５においてX、Y、Zの値を更新後、ステップＳ４３に戻る。
【０２１８】
ステップＳ４６では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０２１９】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０２２０】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ４２〜ステップＳ４６で求まったsinh(θ) 、cosh(θ)から計算する。
【０２２１】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０２２２】
更に、冗長表現では、通常の２進数表現に比べ、ビット値がゼロになる桁数が多くなる為、第２の実施形態よりも漸化式を解く反復回数が少なくなり、高速化が可能である。
【０２２３】
また、計算の過程で条件分岐を含まない為（ステップＳ４３における条件分岐の実体は、反復ループ計算なので、パイプラインの分岐予測エラーによるペナルティにはかからない）、条件予測付きパイプラインを含むＭＰＵで分岐予測エラーを伴うことなく、計算を実行することができる。
【０２２４】
第９の実施形態
数式１３および数式１４の漸化式から、fi = qi・tan-1（2i）(qi = ±1)と置いた時、漸化式は簡単になる事が予想できる。以下に、fi = qi・tan-1（2i）(qi = ±1)と置いた時の、三角関数の計算法について説明する。
【０２２５】
一般に、fi = qi・tan-1（2i）の線形結合で、三角関数の引数を表現する場合、漸化式、漸化式の初期値は次の様に書ける。
【０２２６】
rj = rj-1-qj・tan-1(2j)
θj =θj-1+qj・tan-1(2j)
xj = xj-1-tan(qj・tan-1(2j))・yj-1 = xj-1-qj・2j・yj-1
yj = yj-1+tan(qj・tan-1(2j))・xj-1 = yj-1+qj・2j・xj-1
Zj = Zj-1・cos(qj・tan-1(2j)) = Zj-1・cos(tan-1(2j))
j=0,-2,…,-N(N>0)
【０２２７】
r-1 = θ
θ-1 = 0
x-1 = 1
y-1 = 0
Z-1 = 1
θ = θM
【０２２８】
cos(θ) = xM・ZM
sin(θ) = yM・ZM
【０２２９】
尚、qj の値は、rj の絶対値が最小になるように「1」又は「-1」から選ぶ。すなわち、θjが近似的なθの値になる。したがって、qjが「1」、「-1」の場合について、各々θjの値を計算し、θj−θの絶対値が最小になるqjの値を「1」、「-1」の中から選ぶことにより、qjの値を決定する。求めたqjの値から、xj、yj、Zjを計算する。さらに詳しくは、θjは、tan-1(2j)の級数和で書いたθの漸近値に相当し、rj は、θ−θjに相当する。θjは、反復のたびにθの値に漸近していく。よって、rj の絶対値が最小になるようにqj の値を決める事は、θjがθに漸近するようにqjの値を決める事に相当する。
【０２３０】
したがって、三角関数を計算時の桁落ち等による数値計算上の誤差を無視した理論的な誤差は、θ−θjの差に起因したものになり、具体的にはcosθjの誤差、sinθjの誤差は、それぞれ次式のようになる。
【０２３１】
0004192547.tif 000031
【０２３２】
0004192547.tif 000032
【０２３３】
Ｎビット数の三角関数の計算を行いＮ−１回反復を行うと、θj-θ〜tan-1(2-N)〜2-N程度になる。三角関数が -1< sinθ、cosθ<1 であることを考えると、Ｎビット数の三角関数をＮ−１回の反復計算で求めた場合、三角関数の誤差は、およそ、(θj-θ) 〜2-N程度になる。
【０２３４】
上述した漸化式は、qjで場合分けを行うと次の様に書きなおせる。
【０２３５】
qj = 1 の場合、以下のようになる。
【０２３６】
rj = rj-1-tan-1(2j)
θj =θj-1+tan-1(2j)
xj = xj-1-2j・yj-1
yj = yj-1+2j・xj-1
Zj = Zj-1・cos(tan-1(2j))
【０２３７】
qj = -1 の場合、以下のようになる。
【０２３８】
rj = rj-1+tan-1(2j)
θj =θj-1-tan-1(2j)
xj = xj-1+2j・yj-1
yj = yj-1-2j・xj-1
Zj = Zj-1・cos(tan-1(2j))
【０２３９】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図９に示す。
【０２４０】
【数４６】
0004192547.tif 000033
【０２４１】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。まず初期値として、I=-1、R=θ、X=1、Y=0、Z=1 とおく（ステップＳ４７）。次に、I=M であるか否かが判定される（ステップＳ４８）。ステップ４８において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ５４に進む。ステップＳ４８において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ４９に進む。
【０２４２】
ステップＳ４９では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて qI が「1」、「-1」の場合について、S = R-qI tan-1(2I)をそれぞれ計算（図９中、RPが qI = 1 の場合、RNが qI = -1 の場合）する（ステップＳ５０）。次に、|RP| ≦ |RN| であるか否かを判定する（ステップＳ５０）。そして、|RP| ≦ |RN| であれば、qI = 1 そうでなければ、qI = -1 とし、|S|が最小となる qI を決める。ステップＳ５１において、「Ｙｅｓ」すなわち、|RP| ≦ |RN|であり、qI = 1とされた場合には、ステップＳ５２に進む。ステップＳ５２では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２４３】
W = X
X = X-2I・Y
Y = Y+2I・W
Z = Z・cos(tan-1(2I))
【０２４４】
ステップＳ５２においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ４８に戻る。
【０２４５】
ステップＳ５１において、「Ｎｏ」すなわち、|RP| ≦ |RN|でなく、qI = -1とされた場合には、ステップＳ５３に進む。ステップＳ５３では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２４６】
W = X
X = X+2I・Y
Y = Y-2I・W
Z = Z・cos(tan-1(2I))
【０２４７】
ステップＳ５３においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ４８に戻る。
【０２４８】
ステップＳ５４では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【０２４９】
cos(θ) = X・Z
sin(θ) = Y・Z
【０２５０】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ４７〜ステップＳ５４で求まったsin(θ) 、cos(θ)から計算する。
【０２５１】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０２５２】
また、上述した漸化式における、２j xj-1 と２j yj-1 は、単に xj-1 と yj-1 のビットシフトで対応が可能である為、１反復計算に必要な計算時間は、第１〜第８の実施形態に比べ短くて済む。
【０２５３】
また、tan-1(2j)、cos(tan-1(2j))の数列を予めメモリ上に記憶させ、漸化式を解く際に使用する事により、除算器の省略および従来のＣＯＲＤＩＣ法に比べ高速な計算処理が実現できる。
【０２５４】
第１０の実施形態
数式１３および数式１４の漸化式から、fi = qi・tan-1（2i）(qi = 0,±1)と置いた時、漸化式は簡単になる事が予想できる。以下に、fi = qi・tan-1（2i）(qi = 0,±1)と置いた時の、三角関数の計算法について説明する。
【０２５５】
一般に、fi = qi・tan-1（2i）の線形結合で、三角関数の引数を表現する場合、漸化式、漸化式の初期値は次の様に書ける。
【０２５６】
rj = rj-1-qj・tan-1(2j)
θj =θj-1+qj・tan-1(2j)
xj = xj-1-tan(qj・tan-1(2j))・yj-1 = xj-1-qj・2j・yj-1
yj = yj-1+tan(qj・tan-1(2j))・xj-1 = yj-1+qj・2j・xj-1
Zj = Zj-1・cos(qj・tan-1(2j)) = Zj-1[1-qj2+qj2・cos(tan-1(2j))]
j=0,-2,…,-N(N>0)
【０２５７】
r-1 = θ
θ-1 = 0
x-1 = 1
y-1 = 0
Z-1 = 1
θ = θM
【０２５８】
cos(θ) = xM・ZM
sin(θ) = yM・ZM
【０２５９】
尚、qj の値は、rj の絶対値が最小になるように「1」又は「-1」から選ぶ。すなわち、θjが近似的なθの値になる。したがって、qjが「1」、「-1」の場合について、各々θjの値を計算し、θj−θの絶対値が最小になるqjの値を「1」、「-1」の中から選ぶことにより、qjの値を決定する。求めたqjの値から、xj、yj、Zjを計算する。さらに詳しくは、θjは、tan-1(2j)の級数和で書いたθの漸近値に相当し、rj は、θ−θjに相当する。θjは、反復のたびにθの値に漸近していく。よって、rj の絶対値が最小になるようにqj の値を決める事は、θjがθに漸近するようにqjの値を決める事に相当する。cosθjの誤差、sinθjの誤差については、上述した第９の実施形態において説明したのでここでは省略する。
【０２６０】
上述した漸化式は、qjで場合分けを行うと次の様に書きなおせる。
【０２６１】
qj = 0 の場合、以下のようになる。
【０２６２】
rj = rj-1
θj =θj-1
xj = xj-1
yj = yj-1
Zj = Zj-1
【０２６３】
qj = 1 の場合、以下のようになる。
【０２６４】
rj = rj-1-tan-1(2j)
θj =θj-1+tan-1(2j)
xj = xj-1-2j・yj-1
yj = yj-1+2j・xj-1
Zj = Zj-1・cos(tan-1(2j))
【０２６５】
qj = -1 の場合、以下のようになる。
【０２６６】
rj = rj-1+tan-1(2j)
θj =θj-1-tan-1(2j)
xj = xj-1+2j・yj-1
yj = yj-1-2j・xj-1
Zj = Zj-1・cos(tan-1(2j))
【０２６７】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする三角関数を計算する場合のアルゴリズムの一例を図１０に示す。
【０２６８】
【数４７】
0004192547.tif 000034
【０２６９】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。まず初期値として、I=-1、R=θ、X=1、Y=0、Z=1 とおく（ステップＳ５５）。次に、I=M であるか否かが判定される（ステップＳ５６）。ステップ５６において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ６２に進む。ステップＳ５６において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ５７に進む。
【０２７０】
ステップＳ５７では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて qI が「1」、「-1」の場合について、S = R-qI tan-1(2I)をそれぞれ計算（図９中、RPが qI = 1 の場合、RNが qI = -1 の場合）する（ステップＳ５８）。次に、|RP|、|RN|、|R| の中でいずれが最小であるかを判定する（ステップＳ５９）。ステップＳ５９において、|R| が最小であると判定された場合には、ステップＳ５６に戻る。
【０２７１】
ステップＳ５９において、|R|が最小でないと判定された場合には、|S|が最小となる qI を決める。すなわち、|RP| と |RN| を比較し、|RP| ≦ |RN| のときは、qI = 1 とし、ステップＳ６０に進む。ステップＳ６０では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２７２】
W = X
X = X-2I・Y
Y = Y+2I・W
Z = Z・cos(tan-1(2I))
【０２７３】
ステップＳ６０においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ５６に戻る。
【０２７４】
ステップＳ５９において、|R|が最小でないと判定され、|RP| ≦ |RN|でないときには、qI = -1とされ、ステップＳ６１に進む。ステップＳ６１では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２７５】
W = X
X = X+2I・Y
Y = Y-2I・W
Z = Z・cos(tan-1(2I))
【０２７６】
ステップＳ６１においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ５６に戻る。
【０２７７】
ステップＳ６２では、最終的に求まるX、Y、Zから、下記の式を使いcos(θ)、sin(θ)を計算する。
【０２７８】
cos(θ) = X・Z
sin(θ) = Y・Z
【０２７９】
必要に応じて、tan(θ)等のsin(θ) 、cos(θ)の関数は、ステップＳ５５〜ステップＳ６２で求まったsin(θ) 、cos(θ)から計算する。
【０２８０】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０２８１】
また、上述した漸化式における、２j xj-1 と２j yj-1 は、単に xj-1 と yj-1 のビットシフトで対応が可能である為、１反復計算に必要な計算時間は、第１〜第８の実施形態に比べ短くて済む。
【０２８２】
また、tan-1(2j)、cos(tan-1(2j))の数列を予めメモリ上に記憶させ、漸化式を解く際に使用する事により、除算器の省略および従来のＣＯＲＤＩＣ法に比べ高速な計算処理が実現できる。
【０２８３】
第１１の実施形態
数式１３および数式１４の漸化式から、fi = qi・tanh-1（2i）(qi = ±1)と置いた時、漸化式は簡単になる事が予想できる。以下に、fi = qi・tanh-1（2i）(qi = ±1)と置いた時の、双曲線関数の計算法について説明する。
【０２８４】
一般に、fi = qi・tanh-1（2i）の線形結合で、双曲線関数の引数を表現する場合、漸化式、漸化式の初期値は次の様に書ける。
【０２８５】
rj = rj-1-qj・tanh-1(2j)
θj =θj-1+qj・tanh-1(2j)
xj = xj-1+tanh(qj・tanh-1(2j))・yj-1 = xj-1+qj・2j・yj-1
yj = yj-1+tanh(qj・tanh-1(2j))・xj-1 = yj-1+qj・2j・xj-1
Zj = Zj-1・cosh(qj・tanh-1(2j)) = Zj-1[(1-qj2)+qj2・cosh(tanh-1(2j))]
j=N,N+1,…,M-1,M(M≧N)
【０２８６】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
θ = θM
【０２８７】
cosh(θ) = xM・ZM
sinh(θ) = yM・ZM
【０２８８】
尚、qj の値は、rj の絶対値が最小になるように「1」又は「-1」から選ぶ。すなわち、θjが近似的なθの値になる。したがって、qjが「1」、「-1」の場合について、各々θjの値を計算し、θj−θの絶対値が最小になるqjの値を「1」、「-1」の中から選ぶことにより、qjの値を決定する。求めたqjの値から、xj、yj、Zjを計算する。さらに詳しくは、θjは、tanh-1(2j)の級数和で書いたθの漸近値に相当し、rj は、θ−θjに相当する。θjは、反復のたびにθの値に漸近していく。よって、rj の絶対値が最小になるようにqj の値を決める事は、θjがθに漸近するようにqjの値を決める事に相当する。coshθjの誤差、sinhθjの誤差については、上述した第９の実施形態と同様に考えられるので、ここでは説明を省略する。
【０２８９】
上述した漸化式は、qjで場合分けを行うと次の様に書きなおせる。
【０２９０】
qj = 1 の場合、以下のようになる。
【０２９１】
rj = rj-1-tanh-1(2j)
θj =θj-1+tanh-1(2j)
xj = xj-1+2j・yj-1
yj = yj-1+2j・xj-1
Zj = Zj-1・cosh(tanh-1(2j))
【０２９２】
qj = -1 の場合、以下のようになる。
【０２９３】
rj = rj-1+tanh-1(2j)
θj =θj-1-tanh-1(2j)
xj = xj-1-2j・yj-1
yj = yj-1-2j・xj-1
Zj = Zj-1・cosh(tanh-1(2j))
【０２９４】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図１１に示す。
【０２９５】
【数４８】
0004192547.tif 000035
【０２９６】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。まず初期値として、I=-1、R=θ、X=1、Y=0、Z=1 とおく（ステップＳ６３）。次に、I=M であるか否かが判定される（ステップＳ６４）。ステップ６４において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ７０に進む。ステップＳ６４において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ６５に進む。
【０２９７】
ステップＳ６５では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて qI が「1」、「-1」の場合について、S = R-qI tan-1(2I)をそれぞれ計算（図１１中、RPが qI = 1 の場合、RNが qI = -1 の場合）する（ステップＳ６６）。次に、|RP| ≦ |RN| であるか否かを判定する（ステップＳ６７）。そして、|RP| ≦ |RN| であれば、qI = 1 そうでなければ、qI = -1 とし、|S|が最小となる qI を決める。ステップＳ６７において、「Ｙｅｓ」すなわち、|RP| ≦ |RN|であり、qI = 1とされた場合には、ステップＳ６８に進む。ステップＳ６８では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０２９８】
R = R-tanh-1(2I)
W = X
X = X+2I・Y
Y = Y+2I・W
Z = Z・cosh(tanh-1(2I))
【０２９９】
ステップＳ６８においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ６４に戻る。
【０３００】
ステップＳ６７において、「Ｎｏ」すなわち、|RP| ≦ |RN|でなく、qI = -1とされた場合には、ステップＳ６９に進む。ステップＳ６９では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０３０１】
R = R+tanh-1(2I)
W = X
X = X-2I・Y
Y = Y-2I・W
Z = Z・cosh(tanh-1(2I))
【０３０２】
ステップＳ６９においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ６４に戻る。
【０３０３】
ステップＳ７０では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０３０４】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０３０５】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ６３〜ステップＳ７０で求まったsinh(θ) 、cosh(θ)から計算する。
【０３０６】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０３０７】
また、上述した漸化式における、２j xj-1 と２j yj-1 は、単に xj-1 と yj-1 のビットシフトで対応が可能である為、１反復計算に必要な計算時間は、第１〜第８の実施形態に比べ短くて済む。
【０３０８】
また、tan-1(２j)、cos(tan-1(２j))の数列を予めメモリ上に記憶させ、漸化式を解く際に使用する事により、除算器の省略および従来のＣＯＲＤＩＣ法に比べ高速な計算処理が実現できる。
【０３０９】
実施形態１２
数式１３および数式１４の漸化式から、fi = qi・tanh-1（2i）(qi = 0,±1)と置いた時、漸化式は簡単になる事が予想できる。以下に、fi = qi・tanh-1（2i）(qi = 0,±1)と置いた時の、双曲線関数の計算法について説明する。
【０３１０】
一般に、fi = qi・tanh-1（2i）の線形結合で、双曲線関数の引数を表現する場合、漸化式、漸化式の初期値は次の様に書ける。
【０３１１】
rj = rj-1-qj・tanh-1(2j)
θj =θj-1+qj・tanh-1(2j)
xj = xj-1+tanh(qj・tanh-1(2j))・yj-1 = xj-1+qj・2j・yj-1
yj = yj-1+tanh(qj・tanh-1(2j))・xj-1 = yj-1+qj・2j・xj-1
Zj = Zj-1・cosh(qj・tanh-1(2j)) = Zj-1[(1-qj2)+qj2・cosh(tanh-1(2j))]
j=N,N+1,…,M-1,M(M≧N)
【０３１２】
xN-1 = 1
yN-1 = 0
ZN-1 = 1
θ = θM
【０３１３】
cosh(θ) = xM・ZM
sinh(θ) = yM・ZM
【０３１４】
尚、qj の値は、rj の絶対値が最小になるように「1」又は「-1」から選ぶ。すなわち、θjが近似的なθの値になる。したがって、qjが「1」、「-1」の場合について、各々θjの値を計算し、θj−θの絶対値が最小になるqjの値を「1」、「-1」の中から選ぶことにより、qjの値を決定する。求めたqjの値から、xj、yj、Zjを計算する。さらに詳しくは、θjは、tanh-1(2j)の級数和で書いたθの漸近値に相当し、rj は、θ−θjに相当する。θjは、反復のたびにθの値に漸近していく。よって、rj の絶対値が最小になるようにqj の値を決める事は、θjがθに漸近するようにqjの値を決める事に相当する。coshθjの誤差、sinhθjの誤差については、上述した第９の実施形態と同様に考えられるので、ここでは説明を省略する。
【０３１５】
上述した漸化式は、qjで場合分けを行うと次の様に書きなおせる。
【０３１６】
qj = 0 の場合、以下のようになる。
【０３１７】
rj = rj-1
θj =θj-1
xj = xj-1
yj = yj-1
Zj = Zj-1
【０３１８】
qj = 1 の場合、以下のようになる。
【０３１９】
rj = rj-1-tanh-1(2j)
θj =θj-1+tanh-1(2j)
xj = xj-1+2j・yj-1
yj = yj-1+2j・xj-1
Zj = Zj-1・cosh(tanh-1(2j))
【０３２０】
qj = -1 の場合、以下のようになる。
【０３２１】
rj = rj-1+tanh-1(2j)
θj =θj-1-tanh-1(2j)
xj = xj-1-2j・yj-1
yj = yj-1-2j・xj-1
Zj = Zj-1・cosh(tanh-1(2j))
【０３２２】
以上を踏まえ、X = xj、Y = yj、Z = Zj として、２進数で表された以下に示すθを引数とする双曲線関数を計算する場合のアルゴリズムの一例を図１２に示す。
【０３２３】
【数４９】
0004192547.tif 000036
【０３２４】
簡単の為、読み出しを行っているビット位置のインデックスを変数Ｉとして説明を行う。最下位桁が I=N の場合、初期値として、X=1、Z=1、Y=0、R=θを代入する（ステップＳ７１）。次に、I=M であるか否かが判定される（ステップＳ７２）。ステップＳ７２において、「Ｙｅｓ」すなわち、I=M であると判定された場合には、ステップＳ７８に進む。ステップＳ７２において、「Ｎｏ」すなわち、I=M でないと判定された場合には、ステップＳ７３に進む。
【０３２５】
ステップＳ７３では、変数Ｉをインクリメント、すなわち、I=I+1 とし、続いて qI が「1」、「-1」の場合について、S = R-qI tan-1(2I)をそれぞれ計算（図１２中、RPが qI = 1 の場合、RNが qI = -1 の場合）する（ステップＳ７４）。次に、|RP|、|RN|、|R| の中でいずれが最小であるかを判定する（ステップＳ７５）。ステップＳ７５において、|R| が最小であると判定された場合には、ステップＳ７２に戻る。
【０３２６】
ステップＳ７５において、|R|が最小でないと判定された場合には、|S|が最小となる qI を決める。すなわち、|RP| と |RN| を比較し、|RP| ≦ |RN| のときは、qI = 1 とし、ステップＳ７６に進む。ステップＳ７６では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０３２７】
R = R-tanh-1(2I)
W = X
X = X+2I・Y
Y = Y+2I・W
Z = Z・cosh(tanh-1(2I))
【０３２８】
ステップＳ７６においてX、Y、Zの値を更新し、R = RP とした後、ステップＳ７２に戻る。
【０３２９】
ステップＳ７５において、|R|が最小でないと判定され、|RP| ≦ |RN|でないときには、qI = -1とされ、ステップＳ７７に進む。ステップＳ７７では、以下の計算をそれぞれ行い、X、Y、Zの値を逐次更新する。(Wは一時的にXの更新値を格納する変数)
【０３３０】
R = R+tanh-1(2I)
W = X
X = X-2I・Y
Y = Y-2I・W
Z = Z・cosh(tanh-1(2I))
【０３３１】
ステップＳ７７においてX、Y、Zの値を更新し、R = RN とした後、ステップＳ７２に戻る。
【０３３２】
ステップＳ７８では、最終的に求まるX、Y、Zから、下記の式を使いcosh(θ)、sinh(θ)を計算する。
【０３３３】
cosh(θ) = X・Z
sinh(θ) = Y・Z
【０３３４】
必要に応じて、tanh(θ)等のsinh(θ) 、cosh(θ)の関数は、ステップＳ７１〜ステップＳ７８で求まったsinh(θ) 、cosh(θ)から計算する。
【０３３５】
本アルゴリズムを用いると、従来の２進数の引数を用いて漸化式を解くアルゴリズムに比べ、引数の非ゼロビット桁の反復計算で行われる乗算がおよそ２５％削減でき、計算の高速化が実現できる。
【０３３６】
また、上述した漸化式における、2j xj-1 と２j yj-1 は、単に xj-1 と yj-1のビットシフトで対応が可能である為、１反復計算に必要な計算時間は、第１〜第８の実施形態に比べ短くて済む。
【０３３７】
また、tan-1(2j)、cos(tan-1(2j))の数列を予めメモリ上に記憶させ、漸化式を解く際に使用する事により、除算器の省略および従来のＣＯＲＤＩＣ法に比べ高速な計算処理が実現できる。
【０３３８】
第１３の実施形態
第１〜第１２の実施形態で説明したアルゴリズムを採用した演算装置（電気回路）、プログラムおよびプログラムが記録された記録媒体により、三角関数または双曲線関数等の計算を実際にコンピュータに実行させることができる。記録媒体としては、磁気ディスク等の磁気的メモリでも良いし、電気回路等により構成する電気的メモリなどでも良い。が図１３は、この発明の第１３の実施形態による演算装置の一例である。
【０３３９】
図１３に示す演算装置は、主にＭＰＵ１、ＲＡＭ２、ＲＯＭ３等のメモリ、ハードディスク４および入出力インタフェース５で構成されており、これら各装置は、Ｉ／Ｏコントローラ６を介してバス７により接続されている。
【０３４０】
ＭＰＵ１は、マイクロプロセッサユニットであり、演算、制御等のコンピュータの基本処理を行う。ＲＡＭ２は、書き込み可能メモリであり、ＭＰＵ１により生成される演算結果等のデータを一時的に格納する。ＲＯＭ３は、読み込み専用メモリであり、ＭＰＵ１に実行させるプログラムのマシンコード等を格納している。ハードディスク４は、大容量の記録媒体であり、補助記録媒体として使用される。入出力インタフェース５は、図示しないキーボードやテンキー等の入力装置、ディスプレイやプリンタ等の出力装置と接続するためのインタフェースである。Ｉ／Ｏコントローラ６は、バス７を通じて各装置のデータ入出力の制御を行う。
【０３４１】
この第１３の実施形態による演算装置には、上述した第１〜第１２の実施形態で説明したアルゴリズムがＭＰＵ１で実行可能なプログラムとしてハードディスク４、ＲＡＭ２、ＲＯＭ３等の記録媒体に記録されている。すなわち、この演算装置では、上述した第１〜第１２の実施形態で説明したようなアルゴリズムのプログラムが記録媒体に記録されており、記録されているプログラムを実行することで、三角関数や双曲線関数等の計算が行われる構成となっている。なお、プログラムを記録する記録媒体は、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭなどプログラムを記録できるものであれば、図１３中のハードディスク４などに限られない。
【０３４２】
以下、この演算装置の動作について説明する。まず、ＲＡＭ２に演算の種類、演算データ等が格納される。これら演算の種類および演算データ等は、例えば、図示しない入力装置等から、入力されＲＡＭ２等の主記憶装置に格納される。ＭＰＵ１は、これらデータとハードディスク４等に記録されているプログラムに従い演算の種類に応じた計算を行う。計算は、プログラムにより引数が２進数に変換され、反復計算により求められる。この際、ＲＯＭ３に予め記録しておいた関数のデータテーブル等が参照され計算が行われる。計算結果のデータは、一時的にＲＡＭ２に格納され、例えば図示しないディスプレイ等の出力装置に出力される。
【０３４３】
以上説明した第１３の実施形態の演算装置によれば、三角関数や双曲線関数等の計算のときに、上述した第１〜第１２に実施形態によるアルゴリズムを使用する事で、より少ないデータテーブル（ＲＯＭ３に蓄積されるデータ）で、三角関数、双曲線関数等の計算回路やプログラムを組み込むことができる。
【０３４４】
また、cos(2I)、tan(2I)、cosh(2I)、tanh(2I)のデータテーブルをＲＯＭ３等のメモリ内部やプログラム内部に用意しておくことで、三角関数、双曲線関数等を計算する際に、関数の引数のビット値が非ゼロの所だけを反復計算すれば、関数値を導出することが可能となる。
【０３４５】
また、N≦I≦M の範囲内で、上述したcos(2I)、tan(2I)、cosh(2I)、tanh(2I)のデータテーブルを有する場合には、三角関数、双曲線関数等の関数の引数は、［-2M，2M］の広い範囲での適用が可能である。また、従来のＣＯＲＤＩＣ法では、関数の引数をtan-1(2I) で漸近展開する為、tan-1(2I)〜2I の近似が成り立つ位まで下位ビットを取らないと、関数の引数がtan-1(2I) の線形結合に漸近していかないのに対し、第１〜第８の実施形態のアルゴリズムを使用すれば、関数の引数をtan-1(2I) で漸近展開していない為、引数のビット数が高くなくても十分な計算精度を確保することができる。
【０３４６】
また、第９〜第１２の実施形態で説明したようなtan-1(2I)で漸近展開するアルゴリズムを使用する場合、cos(tan-1(2I))の値のデータテーブルをＲＯＭ３等のメモリ内部やプログラム上に持たせることで、除算器による計算および平方根の計算を行う必要がなくなり、従来のＣＯＲＤＩＣ法に比べ高速な計算が可能となり、関数計算を含む専用回路等を作る場合は、安価に回路を作製することが出来る。また第９〜第１２の実施形態では、qjの値を「1」、「-1」から選ぶとして説明したが、「1」、「-1」、「0」から選ぶとしても良い。
【０３４７】
この発明は、上述したこの発明の実施形態に限定されるものでは無く、この発明の要旨を逸脱しない範囲内で様々な変形や応用が可能である。例えば、上述した第１〜第１２の実施形態のアルゴリズムでは、下位桁のビットから上位桁のビットへと漸化式を解いて行ったが、最上位桁のビットから計算を開始し、下位桁のビットへ漸化式を解く事も可能である。
【０３４８】
また例えば、第１３の実施形態では演算装置としてコンピュータを用いて説明したが、これに限らず、演算装置として電卓、ゲーム機器等の内部で計算を行う機器や、これら機器に組み込まれる演算専用の電気回路等であってもよい。
【０３４９】
また例えば、第１３の実施形態による演算装置では、関数のデータテーブルをＲＯＭ３等のメモリやプログラム内部に持つ事を前提として説明したが、テーブルを持つ代わりに、関数のテーラー展開を用いて下位ビットを計算することで、関数テーブル用のメモリの節約を行っても良い。
【０３５０】
【発明の効果】
この発明による演算方法によれば、三角関数や双曲線関数等の引数を級数の和に展開し、加法定理を利用して除算、平方根計算を含まない形に変形した漸化式の反復計算によって関数値を計算するアルゴリズムを使用しているため、計算速度を向上し、且つ計算回路等のコストをかけずに、三角関数や双曲線関数等の関数の計算をすることができる。
【図面の簡単な説明】
【図１】この発明の第１の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図２】この発明の第２の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図３】この発明の第３の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図４】この発明の第４の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図５】この発明の第５の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図６】この発明の第６の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図７】この発明の第７の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図８】この発明の第８の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図９】この発明の第９の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図１０】この発明の第１０の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図１１】この発明の第１１の実施形態による三角関数計算のアルゴリズムを示す略線図である。
【図１２】この発明の第１２の実施形態による双曲線関数計算のアルゴリズムを示す略線図である。
【図１３】この発明の三角関数計算又は双曲線関数計算のアルゴリズムを利用する電気回路の一例を示す略線図である。
【図１４】従来の三角関数計算のアルゴリズムを示す略線図である。
【図１５】従来の双曲線関数計算のアルゴリズムを示す略線図である。
【符号の説明】
１・・・ＭＰＵ、２・・・Ｉ／Ｏコントローラ、３・・・ＲＡＭ、４・・・ＲＯＭ、５・・・ハードディスク、６・・・入出力インタフェース、７・・・バス
【図１】
0004192547.tif 000045
【図２】
0004192547.tif 000046
【図３】
0004192547.tif 000047
【図４】
0004192547.tif 000048
【図５】
0004192547.tif 000049
【図６】
0004192547.tif 000050
【図７】
0004192547.tif 000051
【図８】
0004192547.tif 000052
【図９】
0004192547.tif 000053
【図１０】
0004192547.tif 000054
【図１１】
0004192547.tif 000055
【図１２】
0004192547.tif 000056
【図１３】
0004192547.tif 000057
【図１４】
0004192547.tif 000058
【図１５】
0004192547.tif 000059