globale Konstante PI?
-
Hallo,
ich habe noch ne Frage zu der Konstante PIbezüglich:
//const float PI = std::acosf(-1); namespace math { template <typename T> static constexpr T PI = T(3.14159265358979323846264); }
constexpr
bedeutet doch, das die Konstante zur Compile-Time bekannt ist?
Und in der reference zu acos kann man auch einenlong double
zurück geben?Ich dachte mir, das könnte ich doch dahin ändern, das die Rechnung von PI gar keinen Einfluss auf den restlichen Code hat.
namespace math { template <typename T> static constexpr T PI = std::acos(-1); }
Das geht aber nicht, wegen
Error C2131 expression did not evaluate to a constant
Kann man das was machen, bzw gibts da was von Rathiopharm
-
@zeropage acos ist nicht constexpr. Du müsstes also eine constexpr variante von acos bauen.
-
Da: 3.141592653589793238462643383279502884
Das reicht mindestens für die nächsten 20 Jahre, eher 20000. Bis Leute halt anfangen zu berechnen, ob ein bestimmtes Atom noch zu dieser Galaxie zählt oder zur nächsten. Siehe auch die Diskussion am Ende deines kürzlichen Threads.Die Acos-Implementierung berechnet ja nicht Pi ab initio in einer dynamischen Reihenentwicklung. Das wäre viel zu langsam. Der Aufruf liest gewissermaßen nur die Konstanten aus, die die Macher deiner Mathebibliothek da in irgendwelche vorberechneten Polynome gesteckt haben, um eine hinreichende Genauigkeit zu erreichen. Möglicherweise ist der Wert an der Stelle -1 sogar eine dieser Konstanten. Da kannst du diese Konstanten auch selber hinschreiben oder die Konstanten nutzen, die diese Mathebibliothek sicherlich bereitstellen wird.
-
Genau.
Und nochwas @zeropage : Wenn du nen
long double
haben willst, dann müsstest du sowiesoacosl(-1)
,acos(-1.0L)
oderacos(T(-1))
verwenden. Vonacos(-1)
bekommst du jedenfalls nur nen normalendouble
.
-
Aha
-
Ich sag ja nur.