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

Il y a un problème assez stupide avec le nombre pi en C et C ++. Pour autant que je sache, M_PI défini en math.h n’est requirejs par aucune norme.

Les nouvelles normes C ++ ont introduit beaucoup de calculs complexes dans la bibliothèque standard – fonctions hyperboliques, std::hermite et std::cyl_bessel_i , différents générateurs de nombres aléatoires et ainsi de suite.

Est-ce que l’une des «nouvelles» normes apportait une constante pour pi? Si non – pourquoi? Comment tout cela complique-t-il les maths sans lui?

Je suis au courant de questions similaires à propos de pi en C ++ (elles datent de plusieurs années et sont anciennes); Je voudrais connaître l’état actuel du problème.

Je suis également très intéressé par les raisons pour lesquelles C ++ n’a toujours pas de constante de pi mais a beaucoup de maths plus 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?

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

    J’ai la chance de pouvoir utiliser Boost (www.boost.org) et ils définissent pi avec un nombre suffisant de décimales même pour un long double 128 bits.

    Si vous n’utilisez pas Boost, codifiez-le vous-même. Le définir avec une fonction sortinggonomésortingque est tentant mais si vous faites cela, vous ne pouvez pas en faire un constexpr . La précision des fonctions sortinggonomésortingques n’est pas non plus garantie par les normes que je connais (cf. std :: sqrt), donc vous êtes vraiment sur un terrain dangereux et vous vous appuyez sur une telle fonction.

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

    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 ++ n’est pas

    Comme d’autres l’ont dit, il n’y a pas de std::pi mais si vous voulez une valeur de PI précise, 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 d’ acos(-1.0) , ce qui est courant mais non garanti .

    Ce n’est pas constexpr , mais en pratique, l’optimisation des compilateurs tels que gcc et clang le valorise au moment de la compilation. Il est toutefois important de le déclarer pour que l’optimiseur fasse du bon travail.

    M_PI est défini par “un standard”, sinon un standard de langue : POSIX avec l’extension X / Open System Interfaces (qui est très couramment prise en charge et requirejse pour les marques UNIX officielles).

    Il est un peu tôt pour poser des questions sur ce qui est “en C ++ 20”, mais depuis que vous l’avez fait: il peut encore avoir de telles constantes. Library Evolution a examiné ce document en mars, mais la conception (en équilibrant la généralité visiblement souhaitable basée sur un modèle avec la facilité d’utilisation dans les cas courants) n’est pas encore finalisée.

    Ce n’est évidemment pas une bonne idée car il n’y a pas de type évident avec lequel définir ce qui est universellement applicable à travers les domaines.

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

    Il est également sortingvial pour tout programmeur de trouver la valeur de pi et de définir sa propre constante adaptée à l’utilisation, de sorte qu’il n’est pas très avantageux de l’inclure dans les en-têtes mathématiques.

    Edité – Pour supprimer le terme nécessaire, car il s’est avéré controversé. C’est trop d’un terme absolu.

    C ++ est un langage vaste et complexe. Pour cette raison, le comité des normes n’inclut que les éléments fortement nécessaires . Autant que possible, il est laissé aux bibliothèques standard non linguistiques, comme Boost.
    boost :: math :: constantes