Signifikante Stellen rausfinden



  • Hallo zusammen

    Ich frag mich grade, wie ich bei der Berechnung der Eulerschen Zahl e die Anzahl korrekter Stellen rausfinden kann.
    Hab schon ein bisschen Code

    double e = 0;
    int nth = 1;
    int n = Benutzereingabe;
    //
    for( int i = 0; i < n; ++i ) {
            e = pow( ( 1.0 + 1.0/i ), 1.0*i );
            cout << "n: " << i << " e: " << e << endl;
            if( nth == 1 && e >= 2.7 && e < 2.8 ) {
                print_results( i, nth, e, );
                nth++;
            }
            if( nth == 2 && e >= 2.71 && e < 2.72 ) {
                print_results( i, nth, e, );
                nth++;
            }
            if( nth == 3 && e >= 2.718 && e < 2.719 ) {
                print_results( i, nth, e, );
                nth++;
            }
    }
    

    Aber das ist mir zuviel redundanz, wenn ich bis auf 12 oder 16 erweitern will. Kann ich die n-te Stelle nicht anders Prüfen?
    2. Frage wäre, wie kann ich mehr als 16 Stellen prüfen, ohne grosse Datentypen nicht oder? Wie berechneten sie zB Pi auf 200 Kommastellen?

    Vielen Dank schonmal im voraus.



  • Erstens: Pack das ganze doch in eine Schleife (und such dir eine Rundungsfunktion, um aus dem "exakten" Wert die notwendigen Stellen abzuschneiden):

    double round_down(double val,int digits)
    {
      double ex = pow(10,digits);
      return (int)(val*ex) / ex;
    }
    
    double round_up(double val,int digits)
    {
      double ex = pow(10,digits);
      return (int)(val*ex+1) / ex;
    }//geht sicher eleganter
    
    if((e >= round_down(exp(1),-nth)) && (e < round_up(exp(1),-nth)
      print_results(i,nth++,e);
    

    Zweitens: Um über die Genauigkeit von long double hinauszugehen, brauchst du eine Spezialbibliothek (wieso komme ich jetzt auf "GMP"?)


Log in to reply