Ich würde tun
template<typename T>
T const pi = std::acos(-T(1));
o
template<typename T>
T const pi = std::arg(-std::log(T(2)));
Ich würde no Eingabe in der erforderlichen Genauigkeit . Was soll das überhaupt bedeuten? Die Präzision, die Sie brauchen ist die Genauigkeit von T
, aber wir wissen nichts über T
.
Man könnte sagen: Was soll das heißen? T
wird float
, double
o long double
. Geben Sie also einfach die Genauigkeit von long double
d.h.
template<typename T>
T const pi = static_cast<T>(/* long double precision */);
Aber wissen Sie wirklich, dass es in der Zukunft nicht einen neuen Gleitkommatyp in der Norm geben wird, der eine noch höhere Genauigkeit als long double
? Sie haben keine.
Und deshalb ist die erste Lösung so schön. Sie können ziemlich sicher sein, dass der Standard die trigonometrischen Funktionen für einen neuen Typ überladen würde.
Und bitte, sagen Sie nicht, dass die Auswertung einer trigonometrischen Funktion bei der Initialisierung eine Leistungseinbuße darstellt.
3 Stimmen
@tiwo, wollen Sie wissen, was der Unterschied ist zwischen
3.14
,3.141592
etatan(1) * 4
?46 Stimmen
Nebenbei bemerkt: cmath sollte in C++ anstelle von math.h verwendet werden, die für C bestimmt ist.
5 Stimmen
In loser Verbindung: siehe cise.ufl.edu/~manuel/obfuscate/pi.c wie man den Wert von PI direkt aus der Definition berechnet.
16 Stimmen
Es ist in C++20 angekommen! stackoverflow.com/a/57285400/895245