185 votes

C ++11, 14, 17 ou 20 introduit-il une constante standard pour pi?

Il est un peu idiot problème avec le nombre pi en C et C++. Autant que je sache M_PI définie en math.h n'est pas requis par la norme.

De nouvelles normes C++ introduit un grand nombre de complexes de mathématiques de la bibliothèque standard, - les fonctions hyperboliques, std::hermite et std::cyl_bessel_i, différents générateurs de nombres aléatoires et ainsi de suite et ainsi de suite.

Les "nouvelles" normes apporter une constante pour pi? Si non, - pourquoi? Comment tout cela compliqué de mathématiques de travailler sans elle?

Je suis conscient des questions similaires à propos de pi en C++ (il y a plusieurs années et les normes anciennes); je voudrais savoir l'état actuel du problème.

Je suis également très intéressé par pourquoi, oh pourquoi C++ n'ai toujours pas de pi constante, mais a beaucoup plus compliqué de faire des mathématiques.

UPD: je sais que je peux définir pi moi-même comme 4*atan(1) ou acos(1) ou double pi = 3.14. Assurez-vous. Mais pourquoi, en 2018, dois-je encore le faire? Comment puis-standard des fonctions mathématiques de travail, sans pi?

UPD2: Selon ce rapport de voyage pour C++ réunion du Comité, en juillet 2019, à Cologne, proposition P0631 (constantes mathématiques) a été acceptée en C++20. De sorte qu'il ressemble à une longue attente, nous aurons le numéro de la pi dans la bibliothèque standard!

118voto

Bathsheba Points 23209

Non, pi n'est pas une constante introduite dans la langue, et c'est une douleur dans le cou.

J'ai la chance que j'ai utiliser Boost (www.boost.org) et ils définissent pi avec un suffisamment grand nombre de décimales, même pour un cryptage de 128 bits long double.

Si vous n'utilisez pas de Boost puis coder en dur elle-même. Définir une fonction trigonométrique est tentant, mais si vous faites cela, vous ne pouvez pas faire une constexpr. L'exactitude des fonctions trigonométriques est pas garanti par aucune norme je sais de (cf. std::sqrt), alors, vraiment, vous êtes sur un terrain dangereux en effet, grâce à une telle fonction.

Il y a un moyen d'obtenir un constexpr de la valeur de pi à l'aide de la métaprogrammation: voir http://timmurphy.org/2013/06/27/template-metaprogramming-in-c/

36voto

Ron Points 10773

Non, aucune des normes n'introduit la constante qui représenterait le nombre pi (π). Vous pouvez approximer le nombre dans votre code:

 constexpr double pi = 3.14159265358979323846;
 

D'autres langages tels que C # ont la constante déclarée dans leurs bibliothèques. C ++ non.

30voto

0x476f72616e Points 2568

Comme d'autres ont dit, il n'y a pas d' std::pi mais si vous voulez précises PI de la valeur, vous pouvez utiliser:

constexpr double pi = std::acos(-1);

Cela suppose que votre implémentation C++ produit correctement arrondi de la valeur de PI à partir d' acos(-1.0), ce qui est fréquent, mais pas garanti.

Ce n'est pas constexpr, mais dans la pratique, l'optimisation des compilateurs comme gcc et clang évaluer au moment de la compilation. Déclarant const est important pour l'optimiseur de faire un bon travail, bien que.

29voto

Davis Herring Points 7254

M_PI est défini par une "norme", si ce n'est une langue standard: POSIX avec l'X/Open Interfaces de Système d'extension (qui est très souvent pris en charge et officiel UNIX image de marque).

Il est (encore) pas certain de ce que sera en C++20, mais puisque vous avez demandé: il sera probablement avoir ces constantes. Le document a été fusionné dans le dernier tour de C++20 caractéristiques (pour le Projet de Comité en août 2019).

Plus précisément, il y aura à la fois être std::numbers::pi (de type double) et une variable de modèle que vous pouvez utiliser si vous souhaitez un autre type à virgule flottante, par exemple, std::numbers::pi_v<float>. La liste complète des constantes on peut le voir dans [les numéros.syn].

11voto

Jack Aidley Points 3993

Ce n'est évidemment pas une bonne idée car il n'est pas évident de type avec qui définissent pi qui est universellement applicable dans tous les domaines.

Pi est, bien sûr, un nombre irrationnel sorte qu'il ne peut pas être correctement représentée par tout types de C++. Vous pourriez dire que l'approche naturelle est donc de la définir dans le plus grand type à virgule flottante disponible. Cependant, la taille du plus grand standard de type à virgule flottante long double n'est pas défini par la norme C++, donc la valeur de la constante varient entre les systèmes. Le pire, dans tout programme de travail type n'était pas le plus grand, le type, la définition de pi serait inappropriée, car elle représenterait un coût de performance sur tous les usages de la pi.

Il est aussi trivial pour tout programmeur pour trouver la valeur de pi et de définir leur propre constant approprié pour l'usage, de sorte qu'il ne fournit pas un grand avantage à inclure dans le calcul les en-têtes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X