web-dev-qa-db-ja.com

constexpr exp、log、pow

constexprexplogなどの標準の<cmath>関数のpowバージョンを移植可能な方法で使用したいと思います。現在、移植性のないソリューションがあります g++は、これらの関数をconstexprとして扱います-C++の非準拠の拡張機能 ですが、移植性と将来性を心配しています(この拡張機能はいつかg++から削除されるかもしれないと思います。

テンプレートメタプログラムではなく、これらの関数のconstexprバージョンに興味があります。コンパイル時と実行時の両方で同じ機能を利用できるようにしたいのです。 Cの互換性は必要ありませんが、高速な実装が必要です。Taylorシリーズの展開などの単純な実装は遅すぎます。

このような機能を実装するにはどうすればよいですか?explog、およびpowに特に興味があります

私の研究から学んだいくつかの接線的に関連する事柄

  • これらの関数の標準準拠バージョンは、C互換性を維持するために副作用(たとえば、constexprの設定)が必要なため、技術的にはerrnoではありません
  • C++ 11では、実装でこれらの関数をconstexprにすることが許可されていましたが、C++ 14では、これは禁止されています( この質問に対する最初の回答 および この質問への回答 )。これは、g++の将来のバージョンでは、関数がconstexprにならない可能性があることを懸念する理由の一部です。
  • g++の各数学関数fooの実装は、組み込み関数__builtin_fooを呼び出しますが、これはconstexprとして扱われます。 foo関数ではなく__builtin_foo関数の呼び出しを開始できます。対応するconstexpr関数が準拠している場合でも、g++の将来のバージョンではfooのままになる可能性がありますが、移植性はありません。
18
user1476176

Sprout の実装を見たことはありますか?

Sproutは、C++ 11/14 constexprベースのコンテナ、アルゴリズム、乱数、解析、レイトレーシング、シンセサイザーなどを提供するヘッダーのみのライブラリです。

https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/math

2
yumetodo