(57)【要約】      （修正有）【課題】微積分タスクを遂行するコンピュータプログラムを最適化する。【解決手段】方法は、少なくとも一つの入力パラメータを有する関数の呼び出しを決定する第１ステップ（Ｓ１１、Ｓ１２、Ｓ１３、Ｓ１４）であって、入力パラメータが、入力パラメータのために可能である値の範囲より実質的に小さい区間の内部に存在するという第１基準と、呼び出しのために要求される正確度に合致する第２基準と、に合致する、ステップと、関数を実装する実行可能コードを自動的に生成し、区間の内部に存在し且つ要求される正確度に準拠する入力パラメータのための実行時間を最小化する第２ステップ（Ｓ２）と、関数を実装する既存のコードを、第２ステップで生成された実行可能コードに交換する第３ステップ（Ｓ３）と、を含む。【選択図】図１
2019102088.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムを最適化する方法であって、
前記コンピュータプログラムの中で、少なくとも一つの入力パラメータを有する関数の呼び出しを決定する第１ステップ（Ｓ１１、Ｓ１２、Ｓ１３、Ｓ１４）であって、前記呼び出しは、
前記少なくとも一つの入力パラメータが、前記入力パラメータのために可能である値の範囲より実質的に小さい区間の内部に存在するという第１基準と、
前記呼び出しのために要求される正確度に合致する第２基準と、に合致する、ステップと、
前記関数を実装する実行可能コードを自動的に生成し、前記区間の内部に存在し且つ前記要求される正確度に準拠する前記少なくとも一つの入力パラメータのための実行時間を最小化する第２ステップ（Ｓ２）と、
前記関数を実装する既存のコードを、前記第２ステップで生成された前記実行可能コードに交換する第３ステップ（Ｓ３）と、
を含む、方法。
【請求項２】
前記第１ステップは、前記区間を決定する（Ｓ１２）ために、
前記コンピュータプログラマのために一組の実行を自動的に動作させるステップと、
前記呼び出しのそれぞれに対して前記少なくとも一つのパラメータの値を測定するための前記実行を自動的に分析するステップと、を含む、請求項１に記載の方法。
【請求項３】
前記要求される正確度は、少なくとも一部が前記コンピュータプログラムの中で前記呼び出しの環境に基づいて決定される（Ｓ１３）、請求項１又は２に記載の方法。
【請求項４】
前記第２ステップ（Ｓ２）は、前記関数を近似する数学的なスイートの項にそれぞれが関連付けられるコード表現を生成するステップを含み、
前記コード表現の数は、前記要求される正確度によって決定される、請求項１〜３のいずれか一項に記載の方法。
【請求項５】
前記関数は、三角関数である、請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記第２ステップは、テイラー級数に基づいて第１実行コードを生成するステップ、又は、チェビシェフ多項式に基づいて第２実行コードを生成するステップにある、請求項５に記載の方法。
【請求項７】
前記第２ステップは、前記区間が０に近い場合、テイラー級数に基づいて前記第１実行コードを生成し、その他の場合、チェビシェフ多項式に基づいて前記第２実行コードを生成するステップにある、請求項６に記載の方法。
【請求項８】
コンピュータプログラムを最適化するためのプラットフォームであって、
前記コンピュータプログラムの中で、少なくとも一つの入力パラメータを有する関数の呼び出しを決定するための手段であって、前記呼び出しは、
前記少なくとも一つの入力パラメータが、前記入力パラメータのために可能である値の範囲より実質的に小さい区間の内部に存在するという第１基準と、
前記呼び出しのために要求される正確度に合致する第２基準と、に合致する、手段と、
前記関数を実装する実行可能コードを自動的に生成し、前記区間の内部に存在し且つ前記要求される正確度に準拠する前記少なくとも一つの入力パラメータのための実行時間を最小化し、前記関数を実装する既存のコードを、前記第２ステップで生成された前記実行可能コードに交換するためのコンピュータプログラムと、を含む、プラットフォーム。
【請求項９】
前記手段は、前記呼び出しの前記自動決定に適合した第２コンピュータプログラムである、請求項８に記載のプラットフォーム。
【請求項１０】
前記コンピュータプログラムは、前記関数を近似する数学的なスイートの項にそれぞれが関連付けられるコード表現を生成するための命令を含み、
前記コード表現の数は、前記要求される正確度によって決定される、請求項８又は９に記載のプラットフォーム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの実行性能を向上させるためのコンピュータプログラムの最適化に関連する。特に、本発明は、微積分（calculus）タスクを遂行するコンピュータプログラムの分野に適合する。
【背景技術】
【０００２】
いくつかのコンピュータプログラムは、天気予報、破壊シミュレーション、３Ｄゲームなど、大量の微積分タスクを含む分野に特化している。
【０００３】
そのようなコンピュータプログラムの開発者は、いかなるコンピュータ言語であれ、実行可能なコードを書き、コンピュータ言語は、特化した微積分タスクを担当する関数をいくつかの位置で呼び出す。関数は、ソフトウェアライブラリによって開発者に利用されることがしばしばある。関数は、一般的なもの（サイン、コサイン微積分、等）であっても、より具体的なもの（３Ｄ微積分…）であってもよい。
【０００４】
しかしながら、一般的に、そのようなライブラリの目的は、アプリケーションに依存しないことである。従って、関数を実装するアルゴリズムは、広範囲の状況に適合するために一般的であることが必要である。
【０００５】
他方で、いくつかのより制限された状況において、結果として精度（precision）がより劣るがアプリケーションを考慮するとそれが容認されることによってバランスが時に保たれ、より良い性能が達成可能であることが知られている。
【０００６】
例えば、三角法の微積分（サイン、コサイン…）は、異なるアルゴリズムによって実装され得るものであり、アルゴリズムは、真の（real）数学的な微積分の良いデジタル近似値を見つけることを目的とする。それぞれのアルゴリズムは、性能、精度（又は正確度（accuracy））の観点において個別の特徴を提供し、特徴は、特に微積分が遂行される入力パラメータの値のような微積分の状況に依存することがある。
【０００７】
その結果、コンピュータプログラムの開発者は、それぞれの関数の呼び出しに対して、ライブラリの実装を使用できるか、特別な実装を使うことが好ましいかについて、注意深くあるべきである。それぞれの呼び出しの決定、選択、及び実装コードの交換は、開発者によって手作業で遂行されるステップである。
【０００８】
コンピュータプログラムの実行可能なコードを自動的に分析するために、いくつかのツールが存在するが、関数の呼び出しを自動的に決定することを提案するものはなく、実行可能コードの「デフォルトの」実装を交換することが望ましい。加えて、微積分の関数の呼び出しに関して、コンピュータプログラムを最適化するプロセスを完全に自動化するツールを提案するソリューションはない。
【発明の概要】
【０００９】
本発明の目的は、上述した欠点を少なくとも部分的に軽減することである。
【００１０】
より具体的には、本発明は、望ましい関数呼び出しを決定することと、これらの決定を、個々の呼び出しの状況に適合した適切な実行可能コードの自動生成、及び、生成された実行可能コードによる元の「デフォルトの」実行可能コードの自動交換と結び付けることとを目標とする。
【００１１】
この目的は、コンピュータプログラムを最適化する方法であって、
コンピュータプログラムの中で、少なくとも一つの入力パラメータを有する関数の呼び出しを決定する第１ステップであって、呼び出しは、
少なくとも一つの入力パラメータが、入力パラメータのために可能である値の範囲より実質的に小さい区間の内部に存在するという第１基準と、
呼び出しのために要求される正確度に合致する第２基準と、に合致する、ステップと、
関数を実装する実行可能コードを自動的に生成し、区間の内部に存在し且つ要求される正確度に準拠する少なくとも一つの入力パラメータのための実行時間を最小化する第２ステップと、
関数を実装する既存のコードを、第２ステップで生成された実行可能コードに交換する第３ステップと、
を含む、方法によって達成される。
【００１２】
好ましい実施形態は、以下の特徴の一つ以上を含み、それらは別々に、又は、一部の組み合わせ又は全体の組み合わせによって実行され得る。
【００１３】
−  第１ステップは、区間を決定する（Ｓ１２）ために、コンピュータプログラマのために一組の実行を自動的に動作させるステップと、呼び出しのそれぞれに対して少なくとも一つのパラメータの値を測定するための実行を自動的に分析するステップと、を含む。
【００１４】
−  要求される正確度は、少なくとも一部がコンピュータプログラムの中で呼び出しの環境に基づいて決定される。
【００１５】
−  第２ステップは、関数を近似する数学的なスイート（suite）の項（term）にそれぞれが関連付けられるコード表現を生成するステップを含み、コード表現の数は、要求される正確度によって決定される。
【００１６】
−  関数は、三角関数である。
【００１７】
−  第２ステップは、テイラー級数に基づいて第１実行コードを生成するステップ、又は、チェビシェフ多項式に基づいて第２実行コードを生成するステップにある。
【００１８】
−  第２ステップは、区間が０に近い場合、テイラー級数に基づいて第１実行コードを生成し、その他の場合、チェビシェフ多項式に基づいて第２実行コードを生成するステップにある。
【００１９】
本発明の他の目的は、コンピュータプログラムを最適化するためのプラットフォームであって、
コンピュータプログラムの中で、少なくとも一つの入力パラメータを有する関数の呼び出しを決定するための手段であって、呼び出しは、
少なくとも一つの入力パラメータが、入力パラメータのために可能である値の範囲より実質的に小さい区間の内部に存在するという第１基準と、
呼び出しのために要求される正確度に合致する第２基準と、に合致する、手段と、
関数を実装する実行可能コードを自動的に生成し、区間の内部に存在し且つ要求される正確度に準拠する少なくとも一つの入力パラメータのための実行時間を最小化し、関数を実装する既存のコードを、第２ステップで生成された実行可能コードに交換するためのコンピュータプログラムと、を含む、プラットフォームにある。
【００２０】
このプラットフォームの実施形態において、手段は、呼び出しの自動決定に適合した第２コンピュータプログラムである。
【００２１】
本発明のさらなる特徴及び長所は、この下に記載される添付の図面を参照して、非限定的な例として与えられる以下の本発明の実施形態の記載から現れるであろう。
【図面の簡単な説明】
【００２２】
【図１】本発明の実施形態における説明に役立つデータフローを示す。
【図２】本発明の実施形態における関数への呼び出しの図式例を示す。
【発明を実施するための形態】
【００２３】
本発明は、微積分を実装する関数への呼び出しに焦点を合わせることによってコンピュータプログラムの性能を向上させるために、既存のコンピュータプログラムを最適化することを目的とする。
【００２４】
以下の説明で「微積分」と呼ぶものは、数学関数、特に結果が正確に決定できないが発見的アルゴリズムによって決定される近似値である数学関数の計算を特に含む。
【００２５】
典型的な、しかし網羅的（exhaustive）ではない例は、サイン又はコサインのような三角関数であり、三角関数は、アプリケーションの広範囲において広く使用されている。サイン又はコサインは、コンピュータによって直接計算できないが、テイラー級数又はチェビシェフ多項式のようなアルゴリズムによって近似値を決定できる。
【００２６】
これら二つのアルゴリズムの説明は、例えばウィキペディア参加型百科事典の中に見つけることができる：
https://en.wikipedia.org/wiki/Taylor_series
https://en.wikipedia.org/wiki/Chebyshev_polynomials
【００２７】
もちろん、サイン又はコサイン関数を実装するために、他の近似アルゴリズムも可能である。
【００２８】
また、数学関数の他のタイプは、「微積分」として考慮することが可能であり、本発明によって扱われる：フーリエ変換及び他の変換、マトリックス演算、等。
【００２９】
すべてのこれらの方法は、主に二つの理由により近似する結果のみを提供する。
【００３０】
第一に、それらは、数学的な級数又は他の近似法に基づいており、定義によって、項の無限の計算の後にのみ正確な結果を提供するためである。
【００３１】
しかしまた、コンピュータは、「真の」値を扱うことができず、例えばＩＥＥＥ７５４の倍精度（Double Precision, DP）のような近似値のみを扱うことができるためでもある。このエンコード方式は、例えば、https://en.wikipedia.org/wiki/IEEE_754に説明されている。
【００３２】
本発明によれば、及び、図１の説明に役立つデータフローに描写されるものとして、第１ステップＳ１１は、最適化されるコンピュータプログラムの中で、いくつかの識別された関数への呼び出しを決定することにある。これらの識別された関数は、上で定義されたように微積分を実装するものである。もちろん、方法は、それらのサブセットに、又は、例えばサイン又はコサイン関数のようなこれらの関数の一つ又は二つにまで、焦点を合わせることのみができる。
【００３３】
入力パラメータの値の現実の例を集めるために、コンピュータプログラムは、数回実行されてもよい。実行の組の終わりに値の「空間」が構成され、最小値と最大値との間の区間を形成できるように、それぞれの実行において、入力パラメータの値は、記憶されてもよい。
【００３４】
さらに、典型的には、実行時に、コンピュータプログラムのループのために、関数への既定の呼び出しは、複数回発生してもよい。それぞれの回において、関数の入力パラメータは、通常は異なる。
【００３５】
図２は、そのような図式の例を説明する。一番目の垂直線は、一連の命令Ｔ１、Ｔ２、Ｔ３…Ｔｉ…Ｔｎでできている主関数ＭＦを表す。ステップＴｎにおいて、主関数は、命令Ｔ２へループする。命令Ｔｉは、ステップＳ１、Ｓ２、Ｓ３…Ｓｐを含む関数ＳＦを呼び出す。命令Ｓｐは、関数呼び出しを終了し、処理は、主関数ＭＦのＴｉの後続の命令に進む。
【００３６】
関数ＳＦの呼び出しは、ソフトウェア言語及び下部のプラットフォームに従って、異なるフォーマットに適合してもよいが、ｙ＝ＳＦ（ｘ）に類似することができる。ここで、ＳＦは、関数の識別子であり、ｙは、結果（一つの又は一組の値）であり、ｘは、入力パラメータ（一つの又は一組の値）である。
【００３７】
関数ＳＦが主関数ＭＦの中の各ループにおいて呼び出されることが、この例において理解できる。それぞれのループにおいて、入力パラメータｘは、通常は異なるべきである。
【００３８】
ステップＳ１１で決定されるそれぞれの呼び出しに対して、第２ステップＳ１２において、方法は、呼び出しのそれぞれの発生時に、関数の入力パラメータの値によって構成される区間を決定することを含む。
【００３９】
既定の呼び出しが数回発生する通常のケースにおいて、最小値及び最大値を決定するために、全てのこれらの発生に対するパラメータの異なる値は、記憶され得る。関数が数個の入力パラメータを含むとき、これは、全てのパラメータに対して実行され得る。
【００４０】
これらの最大値及び最小値は、呼び出しが最適化のために望ましいか否かを決定するために役立つであろう区間を形成する。
【００４１】
ステップＳ１３は、ステップＳ１２と並行して、又はステップＳ１２と順番に遂行され得る。それは、呼び出しのために望ましい精度を決定することにある。
【００４２】
そのような精度又は正確度は、開発されるコンピュータプログラムによれば、開発者によって手作業で決定され得る。
【００４３】
さらに、正確度は、コンピュータプログラムの中で呼び出しの環境に基づいて、少なくとも一部が決定され得る。
【００４４】
この環境は、関数の結果を使用する命令を含んでもよい。
【００４５】
実施形態によれば、この環境は、「ウィンドウ」の中で検査（look at）されてもよく、ウィンドウは、呼び出しの前のいくつかの以前の命令及び呼び出しの後のいくつかの後続の命令を含んでもよい。図２の例において、そのようなウィンドウは、主ループＭＦの［Ｔｉ−α；Ｔｉ＋β］の命令のサブセットとして形式化されてもよい。α及びβは、二つの構成パラメータである。αは、環境を決定するために後続の命令のみが考慮されるように、０であってもよい。
【００４６】
これらの命令の自動分析を通じて、主関数の中で関数の結果がどのように使用されるかについての情報を取得することが可能である。特に、後続の命令によってどのように結果が処理されるかによって、その正確度がこれらの後続の結果の、結果の正確度に与える影響を決定することができる。
【００４７】
普通の例は、後続の命令として、結果関数を丸めることであり、以下の例のようなものである。
ｙ＝ｓｉｎ（ｘ）；
ｚ＝ｒｏｕｎｄ（ｙ；４）．
ここで、“４”は、ｚが小数点以下４桁目に丸められることを意味する。
【００４８】
このような普通の状況において、ｙ＝ｓｉｎ（ｘ）を高い正確度で計算することは不要であろう。なぜならば、付加的な計算データは、後続の命令（すなわち、「丸める」命令）によって失われるからである。
【００４９】
ステップＳ１４において、呼び出しが二つの基準に合致する場合、呼び出しを最適化することが望ましいか否かを決定することが可能である。
−  ステップＳ１２で決定される区間が、入力パラメータの可能な値の範囲より実質的に小さいという第一基準。
−  ステップＳ１３で決定される、関数の結果の要求される正確度に合致するという第二基準。
【００５０】
決定された区間は、いくつかの具体的な特徴がこの区間と関係付けられるように、可能な値の範囲と比べて実質的に小さくあるべきである。言い換えると、それは、この区間の中で適切な関数の、特定の実装の決定のトリガーであるべきである。
【００５１】
その結果として、関連する区間の粒度（granularity）、及び、従って、「実質的に小さい」という用語の意味は、呼び出しが最適化される必要がある関数に依存する。いくつかの関数については、いくつかの特徴は、０への近接のために決定され、例えば、具体的な実装を動作させる。他の関数については、関連する区間は、パラメータの正又は負の値であり得る、等。
【００５２】
特定の実施形態によれば、異なる実装は、関連する区間にそれぞれ関連付けられ得る。次に、ステップＳ１２で決定される区間は、これらの区間と比較され得る。この決定された区間を包含する区間が発見される場合、そして、要求される正確度が決定されている場合、呼び出しは最適化されることが望ましい。
【００５３】
一旦、関数の呼び出しが両方の基準を満たすと決定されると、入力パラメータが以前に決定された範囲に入ったとき、計算された正確度が以前に決定された正確度に緩和され得るという事実を踏まえて、実行可能コードは、この関数の実行時間を最小化するために、ステップＳ２において自動的に生成される。
【００５４】
言い換えると、入力パラメータの区間が決定される例は、後続する実行に十分関連する（例えば、十分大きい）と想定され、コンピュータプログラムは、この同じ区間の中でこの呼び出しのためのパラメータ値を作り出す。
【００５５】
関数を実装するための実行可能コードは、この区間及び要求される正確度の両方によって選択される。この要求される正確度は、自由度としても実装の大きな選択の許可としてもふるまう（act）ことができるが、選択された実装をさらに最適化するためのパラメータとしてもふるまうことができる。
【００５６】
その結果、両方の基準は、関数を実装する最も関連する実行可能コードを定義するために相乗効果を奏して働く。
【００５７】
例えば、関数のいくつかの実装は、一連のコード表現を含み、それぞれは、この関数を近似する数学的な級数の項に関連付けられる。次に、これらの項の（従って、コード表現の）数は、この要求される正確度によって決定される。
【００５８】
その結果、生成された実行可能コードは、要求された正確度に達することが許された項の最小数のみを含むように最適化される（これらの付加的な項を計算することに起因して、任意の付加的な項が、無駄な付加的な正確度を提供し、実行時間の全体を増加させるという事実を踏まえると）。
【００５９】
具体的な例は、三角関数（サイン、コサイン…）のような数学関数に関して提供され得る。
【００６０】
決定された区間が０に近い場合、テイラー級数に基づく実装が選択され得る。そうでなければ、チェビシェフ多項式に基づく実装が選択され得る。
【００６１】
次に、要求される正確度は、関数を実装するために生成された実行可能コードを改善するために使用され得る。
【００６２】
もちろん、他の実装は可能であるが、説明の明確さ及び簡潔さのため、これらの二つの実装に基づく例が説明される。当業者は、この例を他の実装に適合させる方法を導くことが可能であろう。
【００６３】
テイラー級数は、三角関数のような数学関数を近似するための良く知られた技術である。理論的には、無限級数は正確な結果を提供するが、デジタル計算においては、級数は、項の一定の数（certain number）Ｎに明らかに限定されるべきである。
【００６４】
【数１】
2019102088.tif 000003
ここで、Ｂ２ｎはベルヌーイ数である。
【００６５】
次に、要求される正確度は、計算が必要な級数の項の数Ｎを決定するために使用され得る。
【００６６】
選択された実装アルゴリズム及びこの決定された数Ｎによって、実行可能コードは、自動的に生成され得る。
【００６７】
次に、要求される正確度がＮ＝５を決定するとき、生成された実行コードは、以下のように見える：
double mysin3(const double x)
{
double x2, z;
x2 = _mul_rn(x, x);
z  = (0.008333333333333333333333333);
z  =  _fma_rn (z, x2, (-0.1666666666666666666666667));
z  = _fma_rn (z, x2, 0.);
z  = _fma_rn (z, x, x);
return z;
}
ここで、_fmaは、伝統的な“fused multiply and add”関数であり、_mulは、単純な乗算である。
【００６８】
より大きな項の数Ｎのとき、生成された実行コードは、以下のように見える：
double mysin26(const double x)
{
double x2, z;
x2 = _mul_rn(x, x);
z  = (-6.4469596404571726804541778342521e-67);
z  =  _fma_rn (z, x2, (1.6439747083165790335158153477343e-63));
z  =  _fma_rn (z, x2, (-3.8666285139605938868291976978711e-60));
z  =  _fma_rn (z, x2, (8.3596508471828039833247254227972e-57));
z  =  _fma_rn (z, x2, (-1.6552108677421951886982956337138e-53));
z  =  _fma_rn (z, x2, (2.9893108271424045107891219144872e-50));
z  =  _fma_rn (z, x2, (-4.902469756513543397694159939759e-47));
/*** 開示の簡潔さのため、同様な１５行は表示しない ***/
z  =  _fma_rn (z, x2, (-0.0001984126984126984126984127));
z  =  _fma_rn (z, x2, (0.008333333333333333333333333));
z  =  _fma_rn (z, x2, (-0.1666666666666666666666667));
z  = _fma_rn (z, x2, 0.);
z  = _fma_rn (z, x, x);
return z;
}
【００６９】
チェビシェフ多項式に関しては、いくつかの方法が使用され得る。
【００７０】
実施形態によれば、扱うべき部分問題は、決定された区間の中で近似値を最適化するチェビシェフ多項式の組み合わせを発見することにある。これらの多項式Ｐｉは、基数を定義する性質を有する（数学的な意味で）。次に、関数ｆ（ｘ）は、チェビシェフ多項式
【数２】
2019102088.tif 000004
によって近似され得る。
【００７１】
係数ａｉの決定は、方程式を解くことによってなされ得るものであり、正式な微積分ツールによって自動的に実行され得るものである。
【００７２】
Mathematica（登録商標）ソフトウェア製品のような有名なツールの言語を使用することによって、係数の決定は、以下のコードによって実行され得る。
scale[x_] := ((8/(3*Pi))*(x) - (8/(3*Pi^3))*(x^3))^(-1);
indices := {RANGE};
inner[g_, h_] := NIntegrate[(g*h)/(Sqrt[1-x^2]), {x, -1, 1}, WorkingPrecision -> 120, PrecisionGoal -> 25 ];
cheb[i_] := inner[ ChebyshevT[i,x], scale[BOUNDARY*x]*Sin[BOUNDARY *x]]/inner[ChebyshevT[i,x], ChebyshevT[i,x]];
coeffs=cheb/@indices;
apxi[i_] := coeffs[[1+i/2]]*ChebyshevT[i,z];
sine[x_] := scale[x]^(-1) * Total[apxi /@indices] /. { z -> x/( BOUNDARY) };
ここで、BOUNDARYは、区間への上限であり、RANGEは、決定される係数の指数の連続（serial）である。
【００７３】
この例は、以下のＵＲＬで発見された記事の教えに由来する。
http:////mooooo.ooo/chebyshev-sine-approximation
【００７４】
次に、これらの係数は、生成される実行コードに導入され得る。
【００７５】
特に、係数が“Mathematica”のような正式な微積分ツールによって決定されるとき、係数は、変換され表示されてもよい。これを実行するコードの一例は、以下のものである。
P := N[Expand[sine[x]], 22];
For[i=1,i<MAX,i=i+2,Print[CForm[Coefficient[P,x,i]]]]
【００７６】
次に、係数が、上述のテイラー級数の場合より同様な方法で使用され得る。例えば、BOUNDARY=2πによって決定される区間に対し、生成される実行コードは、以下のものであり得る。
double mysin3(const double x)
{
double x2, z;
x2 = _mul_rn(x, x);
z  = (0.002448414377640195526611);
z  =  _fma_rn (z, x2, (-0.1085821850691169157382));
z  =  _fma_rn (z, x2, (0.8331653926375413273273));
z  = _fma_rn (z, x, 0.);
return z;
}
【００７７】
あるいは、より高い精度又は正確度のためには：
double mysin26(const double x)
{
double x2, z;
x2 = _mul_rn(x, x);
z  = (-5.369196481185774086993e-67);
z  =  _fma_rn (z, x2, (1.61918965394921365023e-63));
z  =  _fma_rn (z, x2, (-3.863005007678340870269e-60));
z  =  _fma_rn (z, x2, (8.359276529621670808748e-57));
z  =  _fma_rn (z, x2, (-1.655207971952329213549e-53));
/*** 開示の簡潔さのため、同様な１５行は表示しない ***/
z  =  _fma_rn (z, x2, (-2.505210838544171877505e-8));
z  =  _fma_rn (z, x2, (2.755731922398589065256e-6));
z  =  _fma_rn (z, x2, (-0.0001984126984126984126984));
z  =  _fma_rn (z, x2, (0.008333333333333333333333));
z  =  _fma_rn (z, x2, (-0.1666666666666666666667));
z  =  _fma_rn (z, x2, (1.));
z  = _fma_rn (z, x, 0.);
return z;
}
【００７８】
テイラー級数とは異なり、係数は、要求される正確度すなわち上述のアルゴリズムのRANGE値に、及び、区間すなわちBOUNDARY値に依存する。
【００７９】
チェビシェフ多項式は、RANGEの内部の入力パラメータの全ての可能な値に対してほぼ完全に一定の正確度を有する近似値を提供する（少なくとも、テイラー級数によって提供される近似値と比較して）。しかしながら、テイラー級数は、既定の要求される正確度に対して、より少ない項が要求され、処理時間の観点からより良い最適化を含むように、０に近いより良い近似値を提供する。
【００８０】
さらに、多くの他の実装アルゴリズムは、関数を近似するために使用され得るものであり、それぞれは、正確度、正確度対区間バランス、処理時間等の観点において異なる特徴を備えている。より多くの実装アルゴリズムが利用できるほど、生成される実行コードの決定は、より関連し得る。
【００８１】
一旦、実行コードが生成されると、それは、呼び出された関数を実装した、以前に使用された実行コードを交換するであろう。この交換ステップＳ３は、コンピュータプログラムのグローバルコードに実行コードを単に付加し、関数への呼び出しを、関数のこの新たな実装への呼び出しによって交換することによって実行され得る（すなわち、元の実装を除去することは必須ではなく、元の実装は、コンピュータプログラムの至る所で、それへの他の呼び出しに関して、関数を実装するために使用されるかもしれない）。
【００８２】
本発明は、好ましい実施形態を参照して説明された。しかしながら、多くの変形が、本発明の範囲の中で可能である。
【図１】
2019102088.tif 000005
【図２】
2019102088.tif 000006