web-dev-qa-db-fra.com

constexpr exp, log, pow

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

  • Les versions conformes à la norme de ces fonctions ne sont pas techniquement constexpr car elles doivent avoir des effets secondaires (par exemple, définir errno) pour maintenir la compatibilité C
  • En C++ 11, une implémentation était autorisée à rendre ces fonctions constexpr, 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++
  • L'implémentation de 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é.
18
user1476176

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

2
yumetodo