Runden



  • Hey Danke!!!

    Auf die Idee bin ich garnicht gekommen. Warum ist Vector hier eigentlich nicht angebracht?



  • C++H schrieb:

    Auf die Idee bin ich garnicht gekommen. Warum ist Vector hier eigentlich nicht angebracht?

    Weil std::vector schon nur einige Byte Speicheroverhead hat, ohne die eigentlichen Elemente. Dazu kommt die dynamische Speicheranforderung und Vergrösserung mit entsprechendem Umkopieren. Da der Standard-Heap-Allokator meistens auch übermässig viel Overhead hat und nicht für kleine Allokationen optimiert ist, hat man dort wieder Speicher verschwendet. Von der nötigen Zeit eines new und delete ganz zu schweigen. Alles total unnötig.

    Merke dir einfach, dass Containerklassen nicht ganz leichtgewichtig sind und dazu eingesetzt werden sollten, um mehrere Elemente zu speichern. Ihre Stärken zahlen sich besonders bei vielen Elementen aus. Für so kleine Algorithmen nimmst du lieber einzelne automatische Variablen, oder wenns geht (und hier geht es) ein Einzeiler mit temporären Ausdrücken.



  • Nexus schrieb:

    volkard schrieb:

    return static_cast<int>(floor(zahl+0.5));
    

    Warum floor() ?

    War zu faul zu überlegen, wohin der static_cast rundet.
    Wohin rundet er? Und was passiert bei Minuszahlen?



  • volkard schrieb:

    Wohin rundet er?

    Bei positiven Zahlen werden doch einfach die Nachkommastellen abgeschnitten, oder?

    volkard schrieb:

    Und was passiert bei Minuszahlen?

    Die hast du ja mit assert() ausgeschlossen. 😉

    Naja, je nachdem will man Minuszahlen vielleicht anders behandeln. Von daher auch "Kommt halt drauf an, wie du negative Zahlen behandeln willst". Ich bin mir aber nicht sicher, ob der Standard bei static_cast garantiert, dass negative Zahlen in eine bestimmte Richtung gerundet werden, vielleicht ist dazu wirklich floor() nötig.



  • Trotzdem funktioniert es nicht, ich habe es auf Nexus Art gemacht, trotzdem bekomme ich 3 zurück.

    #include <iostream>
    using namespace std;
    
    int round (float Zahl)
    {
      return static_cast <int>(Zahl + 0.5);
    }
    
    int main ()
    {
      int pi=3.9;
      cout <<round (pi);
    }
    


  • C++H schrieb:

    int pi=3.9;//löl
    


  • volkard schrieb:

    C++H schrieb:

    int pi=3.9;//löl
    

    Ja, ich weiß, dass Pi nicht 3.9 ist, aber ansonsten verstehe ich dein löl nicht.



  • C++H schrieb:

    Ja, ich weiß, dass Pi nicht 3.9 ist, aber ansonsten verstehe ich dein löl nicht.

    Schau doch mal den Datentypen an.



  • Ich Idiot!!!!!!!!!!!!
    Warum merke Dinge nicht beim ersten mal?!
    Danke für den wichtigen Hinweis!



  • int pi=3.9;
    

    Ein guter Compiler hätte dir eine Warnung dafür ausgespuckt, schadet im allgemeinen nicht auch alle Warnungen aus deinem Projekt zu beheben.

    warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data



  • JaykopX schrieb:

    int pi=3.9;
    

    Ein guter Compiler hätte dir eine Warnung dafür ausgespuckt, schadet im allgemeinen nicht auch alle Warnungen aus deinem Projekt zu entfernen.

    "Error: Wrong value for 'pi'"



  • Wegen der Minus Angelegenheit, könnte man doch einfach folgendes machen:

    int round(float Zahl)
    {
      return static_cast<int>((Zahl < 0) ? Zahl - 0.5 : Zahl + 0.5);
    }
    

    Oder liege ich da falsch?


Anmelden zum Antworten