web-dev-qa-db-fra.com

Fonctions mathématiques Constexpr

J'ai tellement remarqué de ceci page qu'aucune des fonctions mathématiques de c ++ 11 ne semble utiliser constexpr, alors que je pense que toutes pourraient l'être. Cela me laisse donc deux questions, l'une est pourquoi ont-ils choisi de ne pas rendre les fonctions constexpr. Et deux pour une fonction comme sqrt je pourrais probablement écrire mon propre constexpr, mais quelque chose comme sin ou cos serait plus délicat, donc y a-t-il un moyen de le contourner.

56
aaronman

En fait, en raison d'un héritage ancien et ennuyeux, presque aucune des fonctions mathématiques ne peut être constexpr, car elles ont toutes pour effet secondaire de définir errno sur diverses conditions d'erreur, généralement des erreurs de domaine.

57
Sebastian Redl

Extrait de "The C++ Programming Language (4th Edition)", par B. Stroustrup, décrivant C++ 11:

"Pour être évaluée au moment de la compilation, une fonction doit être suffisamment simple: une fonction constexpr doit consister en une seule instruction return; aucune boucle et aucune variable locale ne sont autorisées. De plus, une fonction constexpr peut ne pas avoir de côté effets. "

Ce qui signifie qu'il doit être en ligne, sans instructions for, while et if et variables locales. Les effets secondaires sont également interdits (ex: changement d'errno). Un autre problème est que la plupart des fonctions mathématiques sont des instructions FPU qui ne sont pas représentées en c/c ++ pur (elles sont écrites en code assembleur). C'est pourquoi la fonction non of cmath est déclarée constexpr.

9
Adam Szaj

J'ai donc remarqué sur cette page qu'aucune des fonctions mathématiques de c ++ 11 ne semble utiliser constexpr, alors que je pense que toutes pourraient l'être. Cela me laisse donc deux questions, l'une est pourquoi ont-ils choisi de ne pas rendre les fonctions constexpr.

Cette partie est très bien répondu par Sebastian Redl et Adam Szaj ainsi gagné n'y ajoute rien.

Et deux pour une fonction comme sqrt, je pourrais probablement écrire mon propre constexpr, mais quelque chose comme sin ou cos serait plus délicat, donc il y en a autour.

Oui, vous pouvez écrire votre propre version de constexpr sin, cos en utilisant les extensions de la série taylor de ces fonctions. Jetez un oeil à ce repo github super cool qui implémente plusieurs fonctions mathématiques comme des fonctions constexpr Morwenn/static_math

4
Lakshay Garg