wake-up-neo.com

Führt C ++ 11, 14, 17 oder 20 eine Standardkonstante für pi ein?

Es gibt ein ziemlich dummes Problem mit der Zahl pi in C und C++. Soweit ich weiss M_PI definiert in math.h wird von keinem Standard benötigt.

Neue C++ - Standards führten eine Menge komplizierter Mathematik in die Standardbibliothek ein - hyperbolische Funktionen, std::hermite und std::cyl_bessel_i, verschiedene Zufallszahlengeneratoren und so weiter und so fort.

Hat einer der 'neuen' Standards eine Konstante für pi eingeführt? Wenn nicht - warum? Wie funktioniert all diese komplizierte Mathematik ohne sie?

Ich kenne ähnliche Fragen zu pi in C++ (sie sind mehrere Jahre alt und entsprechen den Standards). Ich würde gerne den aktuellen Stand des Problems erfahren.

Ich interessiere mich auch sehr für warum oh warum C++ hat immer noch keine pi-Konstante, aber viel kompliziertere Mathematik.

UPD: Ich weiß, dass ich pi selbst als 4 * atan (1) oder acos (1) oder double pi = 3.14 definieren kann. Sicher. Aber warum muss ich das 2018 noch tun? Wie funktionieren mathematische Standardfunktionen ohne pi?

UPD2: Laut this Reisebericht für die C++ - Ausschusssitzung im Juli 2019 in Köln wurde Vorschlag P0631 (mathematische Konstanten) in C++ 20 aufgenommen. Es sieht also so aus, als hätten wir endlich die Nummer pi in der Standardbibliothek!

157
Amomum

Nein, pi ist immer noch keine Konstante, die in die Sprache eingeführt wird, und es ist ein Schmerz im Nacken.

Ich habe das Glück, dass ich Boost (www.boost.org) verwende und sie pi mit einer ausreichend großen Anzahl von Dezimalstellen für sogar 128 definieren bisschen long double.

Wenn Sie Boost nicht verwenden, codieren Sie es selbst. Es ist verlockend, es mit einer trigonometrischen Funktion zu definieren, aber wenn Sie dies tun, können Sie es nicht zu einem constexpr machen. Die Genauigkeit der trigonometrischen Funktionen wird auch von keinem mir bekannten Standard garantiert ( vgl. . std::sqrt), Sie befinden sich also wirklich auf gefährlichem Boden und verlassen sich in der Tat auf eine solche Funktion.

Es gibt eine Möglichkeit, mithilfe der Metaprogrammierung einen constexpr -Wert für pi zu erhalten: siehe http://timmurphy.org/ 2013/06/27/template-metaprogramming-in-c /

94
Bathsheba

Nein, keiner der Standards führt die Konstante ein, die Zahl pi (π) darstellen würde. Sie können die Zahl in Ihrem Code approximieren:

constexpr double pi = 3.14159265358979323846;

Andere Sprachen wie C # haben die in ihren Bibliotheken deklarierte Konstante. C++ nicht.

32
Ron

Wie andere gesagt haben, gibt es kein std::pi, Aber wenn Sie einen genauen Wert für PI wünschen, können Sie Folgendes verwenden:

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

Dies setzt voraus, dass Ihre C++ - Implementierung einen korrekt gerundeten Wert von PI aus acos(-1.0), erzeugt, der häufig vorkommt, jedoch nicht garantiert ist .

Es ist nicht constexpr, aber in der Praxis wird es beim Kompilieren von Compilern wie gcc und clang ausgewertet. Das Deklarieren von const ist jedoch wichtig, damit der Optimierer gute Arbeit leistet.

29
0x476f72616e

M_PI ist definiert durch "ein Standard", wenn nicht ein Sprachstandard : POSIX mit der X/Open System Interfaces-Erweiterung (die sehr häufig unterstützt wird und für das offizielle UNIX-Branding erforderlich ist).

Es ist (noch) nicht sicher, was in C++ 20 sein wird, aber da Sie gefragt haben: Es wird wahrscheinlich solche Konstanten haben. Library Evolution genehmigte das Papier der Vorgängerversion (mit Namespaces und variablen Vorlagen) im November 2018 und könnte im August 2019 im Komiteeentwurf erscheinen.

24
Davis Herring

Dies ist offensichtlich keine gute Idee, da es keinen offensichtlichen Typ gibt, mit dem pi definiert wird und der für alle Domänen universell anwendbar ist.

Pi ist natürlich eine irrationale Zahl, daher kann sie nicht korrekt durch den Typ any C++ dargestellt werden. Sie könnten argumentieren, dass der natürliche Ansatz daher darin besteht, ihn in dem größten verfügbaren Gleitkommatyp zu definieren. Die Größe des größten Standard-Gleitkommatyps long double ist nicht durch den C++ - Standard definiert, daher würde der Wert der Konstante zwischen den Systemen variieren. Schlimmer noch, für jedes Programm, in dem der Arbeitstyp nicht der größte Typ war, wäre die Definition von pi ungeeignet, da sie bei jeder Verwendung von pi Leistungskosten verursachen würde.

Es ist auch für jeden Programmierer trivial, den Wert von pi zu finden und eine eigene Konstante zu definieren, die für die Verwendung geeignet ist. Daher bietet es keinen großen Vorteil, sie in die mathematischen Header aufzunehmen.

13
Jack Aidley