globale Konstante PI?



  • Hallo,
    ich habe noch ne Frage zu der Konstante PI 😌

    bezü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 einen long 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.


  • Mod

    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 sowieso acosl(-1), acos(-1.0L) oder acos(T(-1)) verwenden. Von acos(-1) bekommst du jedenfalls nur nen normalen double.



  • Aha 🙂



  • Ich sag ja nur.


Log in to reply