彼らはブルートフォースアプローチを使って考え出されたのですか、そうするアルゴリズムがありますか?対数はどのようにプログラムされていますか?
答えて
適切な数値演算ライブラリで自然対数などの関数を実装すると、誤差がulp(最小精度の単位)以下になります。数学ライブラリ関数の実装者の目標は、できるだけ少ない計算量で所望の精度を達成する最適な近似を見つけることです。テイラー級数は、所望の精度を達成するにはあまりにも多くの項が必要とされるので、通常は貧弱な選択である。
代表的な武器は、表現可能なすべての実数からいくつかの非常に小さな領域までの範囲を減らし、次にこの狭い範囲にわたって目的の関数の正確な近似をもたらす最適な近似を使用することです。この最適近似のための典型的な武器は、多項式または有理数多項式(2つの多項式の比)である。実装には多項式係数が含まれています。これらの係数は、Remes Exchangeアルゴリズムなどの最適化手法によって構築されます。
自然対数の場合、範囲を簡単に減らす方法があります。実数は、ほとんど普遍的仮数と指数の点で表され: Pは整数であり、メートルは、1と2の間である X = メートル * 2 Pは、したがって、( Xログ)= log(m)+ p * log(2)。後者の用語、p * log(2)は、既知の定数による単なる乗算である。したがって、問題は1と2の間の(または1/2と1の間の)対数を見つけることに減少する。 [1、2]の中間で√2が対数的であるという事実を用いて、さらに範囲を減らすことができる。したがって、必要なのは、1と√2の間の数の対数を計算する方法です。これは一般的に有理多項式で行われます。 2次多項式多項式と3次の多項式の比は、これに対して非常にうまく機能します。
.5 ULPは野心的な目標です。正確に丸められたものと同じです。つまり、数学的に正確な結果に最も近い表現可能な数値が返されなければなりません。 CRlibmプロジェクト(http://lipforge.ens-lyon.fr/www/crlibm/)はこれを行うことを目指していますが、不完全です(逆双曲線関数が提供されていないなど)。忠実な丸め(1 ULP未満)はより達成可能な目標であり、典型的なライブラリはいくつかのULPのエラーを許容します。一般的なプロセッサでは除算が遅いため、合理的な関数は避けられます。たとえば、接線は有理関数を使用することができますが、正弦と対数は単純な多項式を使用します。 –
良いコメント。 0.5 ULPはあまりにも野心的です。有理多項式と単純型の関係については、分割のコスト増加と乗算との相殺以上の程度の減少があれば、有理数はより良いことがあります。有理多項式を使う 'log'の実装が複数見つかりました。ログは近似としては非常に良い関数です。最悪の場合のエラーは1に近い数値で発生し、ここでもエラーはULP内に保持されます。 –
範囲を[1.0,2.0]に減らすと、log(0.999 ...)付近に大きな誤差が生じます.David Hammenはコメントしました。私が知っている実装では、[2/3、4/3]や[sqrt(0.5)、sqrt(2.0)のように内部で1.0の範囲に縮小することでこの問題を回避します。プログラミングの面では、これを行うための追加の命令がいくつかあります:if(m> constant){p + = 1; m * = 0.5;} –
- 1. 複素数/虚数はどのようにプログラムされていますか?
- 2. コンパイルされたプログラムはどのようにOSと対話しますか?
- 3. C++プログラムはどのように作られていますか?
- 4. screencast-utilityはプログラム的にどのように開発されていますか?
- 5. プログラムはどのようにROMにロードされていますか?
- 6. "a"は私のプログラムでどのように使用されていますか?
- 7. 対話型シェルのManyToManyFieldはどのようにリストされていますか?
- 8. SASエンコードオプションはプログラムによってどのように取得されますか?
- 9. 2Dビンパッキングはプログラムによってどのように達成されますか?
- 10. Perlプログラムの絶対パスを相対パスから取得するにはどうすればよいですか?
- 11. iPhoneアプリ:Emojiはどのようにプログラムされましたか?
- 12. スケジュールされたPythonプログラムはどのように実行されますか?
- 13. AppleはXcodeをどのようにプログラムしていますか?
- 14. Photoshopなどのプログラムはどのようにレンダリングされますか?
- 15. 一般 - 関数はどのようにメモリに表されていますか?
- 16. autolayoutを介して配置されたアイテムに対して、プログラムによってレンダリングされた実際の値をどのように取得しますか?
- 17. コマンドラインツールのハンドルバーブロックヘルパー関数はどのように定義されていますか?
- 18. この引数はどのように展開されていますか?
- 19. スキーマに対してJSON文字列をプログラムで検証するにはどうすればよいですか?
- 20. アプリケーションまたは対話型プログラムを作成するにはどうすればよいですか?
- 21. .NET PointToClient関数はどのように実装されていますか?
- 22. アセンブリ変数はどのように実装されていますか?
- 23. ASMインタープリタ:ローカル変数はどのように格納されていますか?
- 24. バリエーションはどのように保存されていますか?
- 25. @privateはどのように実装されていますか?
- 26. gcc/g ++はどのようにブートストラップされていますか?
- 27. PCI ROMはどのようにシャドーされていますか?
- 28. BigDecimalはどのように実装されていますか?
- 29. lpCmdLineはどのように格納されていますか?
- 30. time_tはどのように定義されていますか?
'ブルートフォース'と 'アルゴリズム'は互いに排他的ではありません。あなたの質問は誤った二分法を示します。答えは、そうです、アルゴリズムがあります。 –
ああ、ブルートフォースが実際にはアルゴリズムであることを忘れてしまったような気がします。ありがとう。 – Taffer
"ブルートフォース"はアルゴリズムの性質で、より少ない計算力でより少ない思考で逃げることができます。 – starblue