J'aimerais utiliser les versions constexpr
des fonctions <cmath>
Standard comme exp
, log
, pow
de manière portable. J'ai actuellement une solution non portable g++
Traite ces fonctions comme constexpr
- une extension non conforme de C++ , mais je suis préoccupé par la portabilité et la pérennité (J'imagine que cette extension pourrait un jour être supprimée de g++
).
Je suis intéressé par les versions constexpr
de ces fonctions, pas les métaprogrammes de modèle - je veux que les mêmes fonctionnalités soient disponibles à la fois lors de la compilation et de l'exécution. Je n'ai pas besoin de la compatibilité C, mais j'ai besoin d'implémentations rapides - des implémentations naïves telles que les extensions de la série Taylor seraient trop lentes.
Comment puis-je implémenter de telles fonctionnalités? Je suis spécifiquement intéressé par exp
, log
et pow
Quelques choses tangentiellement liées que j'ai apprises de ma recherche
constexpr
car elles doivent avoir des effets secondaires (par exemple, définir errno
) pour maintenir la compatibilité Cconstexpr
, mais à partir de C++ 14, cela est interdit (par la première réponse à cette question et - la réponse à cette question ). Cela fait partie du fait que je crains que les fonctions ne soient pas constexpr
dans les futures versions de g++
g++
De chaque fonction mathématique foo
appelle simplement une fonction intégrée __builtin_foo
, Qui est traitée comme constexpr
. Je pourrais peut-être commencer à appeler les fonctions __builtin_foo
Plutôt que les fonctions foo
- celles-ci pourraient rester constexpr
dans les futures versions de g++
Même si le foo
sont rendues conformes - mais cela ne contribue qu'à la pérennité, pas à la portabilité.Avez-vous déjà regardé l'implémentation de Sprout ?
Sprout est une bibliothèque uniquement en-tête qui fournit des conteneurs, des algorithmes, des nombres aléatoires basés sur constexpr C++ 11/14, l'analyse, le traçage de rayons, un synthétiseur, etc.
https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/math