web-dev-qa-db-fra.com

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

Il y a un problème plutôt idiot avec le nombre pi en C et C++. Autant que je sache, M_PI défini dans math.h n'est requis par aucune norme.

Les nouvelles normes C++ ont introduit beaucoup de mathématiques compliquées dans la bibliothèque standard: fonctions hyperboliques, std::hermite et std::cyl_bessel_i, différents générateurs de nombres aléatoires, etc.

Les "nouveaux" standards ont-ils introduit une constante pour pi? Si non, pourquoi? Comment toutes ces mathématiques compliquées fonctionnent-elles sans cela?

Je suis au courant de questions similaires à propos de pi en C++ (il y a plusieurs années et normes); J'aimerais connaître l'état actuel du problème.

Je suis aussi très intéressé par pourquoi oh pourquoi C++ n’a toujours pas de constante de pi mais a beaucoup plus de mathématiques compliquées.

UPD: Je sais que je peux définir pi moi-même comme 4 * atan (1) ou acos (1) ou double pi = 3.14. Sûr. Mais pourquoi en 2018 dois-je encore le faire? Comment les fonctions mathématiques standard fonctionnent-elles sans pi?

UPD2: Selon le this compte rendu de voyage du comité C++ réuni en juillet 2019 à Cologne, proposition P0631 (constantes mathématiques) a été accepté en C++ 20. Il semble donc que nous aurons le numéro pi dans la bibliothèque standard!

157
Amomum

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

J'ai la chance d'utiliser Boost (www.boost.org) et de définir pi avec un nombre suffisamment grand de décimales pour un nombre suffisant de décimales. bit long double.

Si vous n'utilisez pas Boost, codez-le en dur. Le définir avec une fonction trigonométrique est tentant, mais si vous le faites, vous ne pourrez pas en faire un constexpr. La précision des fonctions trigonométriques n’est également garantie par aucun standard que je connaisse ( cf . std::sqrt), vous êtes donc vraiment dangereux. sol en effet en s'appuyant sur une telle fonction.

Il existe un moyen d'obtenir une valeur constexpr pour pi en utilisant la métaprogrammation: voir http://timmurphy.org/2013/06/27/template-metaprogramming-in-c /

94
Bathsheba

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 # have la constante déclarée dans leurs bibliothèques. C++ non.

32
Ron

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

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

Cela suppose que votre implémentation C++ génère une valeur correctement arrondie de PI à partir de acos(-1.0), courante mais non garantie .

Ce n'est pas constexpr, mais en pratique, l'optimisation de compilateurs tels que gcc et clang l'évalue au moment de la compilation. Le déclarer const est important pour que l'optimiseur fasse du bon travail.

29
0x476f72616e

M_PI est défini par "un standard", sinon un langage standard: POSIX avec le X/Extension Open System Interfaces (très communément prise en charge et requise pour la marque officielle UNIX).

Ce n'est (encore) pas certain de savoir ce qui se passera dans C++ 20, mais puisque vous avez demandé: cela aura probablement telles constantes . Library Evolution a approuvé le document de la version précédente (avec espaces de noms et modèles variables) en novembre 2018, qui pourrait figurer dans le projet de comité en août 2019.

24
Davis Herring

Ce n’est évidemment pas une bonne idée car il n’existe pas de type évident permettant de définir pi qui soit universellement applicable dans tous les domaines.

Pi est, bien sûr, un nombre irrationnel, il ne peut donc pas être correctement représenté par le type aucun C++. Vous pourriez donc soutenir que l'approche naturelle consiste donc à définir le type de virgule flottante le plus grand disponible. Toutefois, la taille du plus grand type de virgule flottante standard long double n'est pas définie par la norme C++, de sorte que la valeur de la constante varie entre les systèmes. Pire, pour tout programme dans lequel le type de travail n'était pas ce type le plus important, la définition de pi serait inappropriée car elle imposerait un coût de performance à chaque utilisation de pi.

Il est également aisé pour tout programmeur de trouver la valeur de pi et de définir sa propre constante utilisable. Par conséquent, il n’est pas très avantageux de l’inclure dans les en-têtes de calcul.

13
Jack Aidley