Pi angeben



  • Ich würde eine vom Compiler zur Verfügung gestellte Konstante ala M_PI verwenden. Oder wenn sonst nichts besseres verfügbar ist:

    const double pi = 4 * atan(1);// bzw. 2 * acos(0)
    

    Edit:

    EOutOfResources schrieb:

    Ansonsten als Aufzählung (enum).

    enums kann man ja auch so gut mit Gleitkomma-Werten initialisieren 😉



  • CStoll schrieb:

    Ich würde eine vom Compiler zur Verfügung gestellte Konstante ala M_PI verwenden.

    Gehört nicht zum Standard...

    CStoll schrieb:

    enums kann man ja auch so gut mit Gleitkomma-Werten initialisieren 😉

    Oh, mist. Ich überseh' das immer...



  • EOutOfResources schrieb:

    CStoll schrieb:

    Ich würde eine vom Compiler zur Verfügung gestellte Konstante ala M_PI verwenden.

    Gehört nicht zum Standard...

    Habe ich auch nie behauptet.



  • Wir wärs mit boost?

    const double pi = boost::math::constants::pi<double>();
    

    *Edit
    Oh... wie kann man Smileys deaktivieren innerhalb von Code?



  • Dazu hab ich gleich mal 2 Fragen
    1.: Kann man aussagen darüber machen, welche Möglichkeit pi zu generieren am Genausten ist? Weil eigentlich ist das ja eh alles implementation defined (also der Algorithmus)

    const long double pi = std::acos(-1.L);
    //vs
    const long double pi = 4 * std::atan(1.L)
    

    Bei der 2. Methode werden ja durch die Multiplikation zwei Nachkommastellen sozusagen weggeschnitten

    2.: Ist es nach dem aktuellen Standard erlaubt, eine konstante Variable durch eine Funktion wie acos zu initialisieren, oder ist das eine Kompilererweiterung? [in C++0x gibts für sowas ja constexpr)?



  • asdfasd schrieb:

    Dazu hab ich gleich mal 2 Fragen
    1.: Kann man aussagen darüber machen, welche Möglichkeit pi zu generieren am Genausten ist? Weil eigentlich ist das ja eh alles implementation defined (also der Algorithmus)

    const long double pi = std::acos(-1.L);
    //vs
    const long double pi = 4 * std::atan(1.L)
    

    Bei der 2. Methode werden ja durch die Multiplikation zwei Nachkommastellen sozusagen weggeschnitten

    Nein, es werden keine Nachkommastellen abgeschnitten, nur der Exponent um zwei Schritte erhöht. Was nun genauer ist, kann ich allerdings nicht sagen

    2.: Ist es nach dem aktuellen Standard erlaubt, eine konstante Variable durch eine Funktion wie acos zu initialisieren, oder ist das eine Kompilererweiterung? [in C++0x gibts für sowas ja constexpr)?

    Afaik kannst du Konstanten mit allem füttern, was dir vor die Flinte kommt, zumindest solange du den Wert erst zur Laufzeit benötigst. Problematisch wird es, wenn du den Wert in einem Kontext benötigst, wo ihn der Compiler auswerten will.
    (bei mathematischen Werten wie Pi dürften das eher Optimierungsfragen sein)



  • Wieso nicht einfach zur Compilezeit mit dem Wert füttern?


  • Mod

    Sagt mal, habt ihr alle kein Internet? Wozu sich pi erst berechnen lassen? Noch dazu mit einer Methode die möglicherweise auf der letzten Stelle ungenau sein könnte.

    const double PI = 3.1415926535897932384626434;
    
    // oder
    
    const long double PI = 3.14159265358979323846264338327950288419716939937510;
    

    Und gut is.



  • Ich bevorzuge

    const int pi = 3;
    

    ...mal im Ernst: Warum nicht einfach die Konstante eintragen? Pi wird sich ja niemals verändern...



  • Man kann das auch zur Compilezeit nähern - jedenfalls, wenn double einem reicht. Long double ist auf den letzten Nachkommastellen schwieriger.

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    
    template<int k> struct bbp_data {
      static long double const p = 16.0 * bbp_data<k - 1>::p;
      static long double const val
      = bbp_data<k - 1>::val +
        (1.0 / 16.0 / bbp_data<k - 1>::p) * (4.0 / (8 * k + 1) - 
                                             2.0 / (8 * k + 4) -
                                             1.0 / (8 * k + 5) - 
                                             1.0 / (8 * k + 6));
    };
    
    template<> struct bbp_data<-1> {
      static long double const p   = 1.0 / 16.0;
      static long double const val = 0.0;
    };
    
    int main() {
      double const pi = bbp_data<20>::val; // 13 reicht bei mir, aber etwas Luft kann nicht schaden.
    
      std::cout << std::setprecision(20)
                << pi   << std::endl
                << M_PI << std::endl;
    }
    


  • Was ein Blödsinn 👎



  • @ seldon
    Ist wohl ziemlich sinnlos. Man muss es nicht mehr selber rechnen wenn es schon berechnet wurde (und das auf ziemlich viele Stellen genau ^^). Da PI sich nicht ändert kann man das ruhig hard coden 😉


Anmelden zum Antworten