x = "Natürliche Zahl" ???



  • Wie kann man bei C / C++ dem Programm sagen, dass x, bzw jede andere Variable, eine natürliche Zahl, also keine Komma-Zahl ist? Allerdings soll es immer noch eine negative Zahl sein können...

    Negative Natürliche Zahlen? Witzbold 🤡



  • Folgender sauberer Code prüft bei einem Double-Wert, ob es sich um eine natürliche oder keine natürliche Zahl handelt.

    bool IsNatural(const double &dValue)
    {
        int nValue = static_cast<int>(dValue);
    
        bool bRet = false;
        if(dValue - static_cast<double>(nValue) == 0)
        {
            bRet = true;
        }
    
        return bRet;
    }
    




  • ChrisPlusPlus schrieb:

    Folgender sauberer Code prüft bei einem Double-Wert, ob es sich um eine natürliche oder keine natürliche Zahl handelt.

    Demnach ist bei mir 6 Milliarden (6e9) keine natürliche Zahl. -2 allerdings schon.



  • Folgender sauberer Code

    😃 👍



  • ChrisPlusPlus schrieb:

    (const double &dValue)
    

    😕 😕



  • Freak_Coder schrieb:

    ChrisPlusPlus schrieb:

    (const double &dValue)
    

    😕 😕

    wurde schon auf wtf hingewiesen, ach ja weiter oben^^



  • Dann nehmt eben statt int long ihr Klugscheißer 👎



  • man könnte auch auf Bitebene die Mantisse untersuchen 😉



  • (const double &dValue) ist sauberer Code

    Paellon und Freak_Coder ihr kennt nicht den tieferen Sinn dieser Art der Parametrisierung nicht? Hmm
    😕



  • Pellaeon schrieb:

    wurde schon auf wtf hingewiesen, ach ja weiter oben^^

    😃



  • ChrisPlusPlus schrieb:

    (const double &dValue) ist sauberer Code

    Paellon und Freak_Coder ihr kennt nicht den tieferen Sinn dieser Art der Parametrisierung nicht? Hmm
    😕

    😕 😕 Ääääh, Nein! 😃

    Dann sag uns mal bitte den tieferen Sinn...
    Da bin ich aber mal gespannt ![wur]



  • Nun, so legt der Copykonstuktor bei jedem Parameter eine Kopie des Typs oder Objektes an. Diesen zum Teil performancefressende Umstand wird durch die Referenz-Operator entgegen gewirkt. Daß aber die Referenz nicht überschrieben werden kann, wird sie einfach als Konstant festgelegt.

    Desweiteren empfiehlt Scott Meyers wann immer möglich const zu verwenden. Das erhöht die Lesbarkeit von code und macht ihn mit unter auch fehlerresistenter!

    QED, meine Herren



  • ChrisPlusPlus schrieb:

    Nun, so legt der Copykonstuktor bei jedem Parameter eine Kopie des Typs oder Objektes an. Diesen zum Teil performancefressende Umstand wird durch die Referenz-Operator entgegen gewirkt. Daß aber die Referenz nicht überschrieben werden kann, wird sie einfach als Konstant festgelegt.

    Bei einem eingebauten Typ wie double ???
    Du werwechselst da was mit Objekten...

    (double dValue)
    

    hätte vollkommen gereicht.



  • Bei double selbstverständlich nicht! Benutzerdefinierte Typen (structs udgl.!)

    (double &dValue) ... reicht technisch selbstverständlich auch, ist aber aus besagten Gründen unsauber!



  • ChrisPlusPlus schrieb:

    Dann nehmt eben statt int long ihr Klugscheißer 👎

    Bei mir sind int und long gleich groß. Selbst wenn das nicht so wäre, ist es nur Schmerzverlagerungstherapie. Nimm einfach irgendeinen Wert, der außerhalb des Wertebereichs des größten Ganzzahltyps auf deiner Plattform liegt, und schon funktioniert deine Funktion nicht mehr. Und was ist mit den negativen Zahlen?

    P.S.: Mit deiner Ausdrucksweise wirst du hier viele Freunde finden.



  • ChrisPlusPlus schrieb:

    Bei double selbstverständlich nicht!

    Und wieso schreibst du das dann ...



  • Tut mir leid! Nun, ich fand diesen Einwand einfach nur doof! Man ist eben nur auf ein bestimmtes Intervall von Werten beschränkt, da hilft auch kein 16-Byte long uder ähnliches! Wäre es nicht das C++-Forum, hätte ich ASSERT selbstverständlich vorgeschlagen.



  • ChrisPlusPlus schrieb:

    Nun, so legt der Copykonstuktor bei jedem Parameter eine Kopie des Typs oder Objektes an. Diesen zum Teil performancefressende Umstand wird durch die Referenz-Operator entgegen gewirkt. Daß aber die Referenz nicht überschrieben werden kann, wird sie einfach als Konstant festgelegt.

    Desweiteren empfiehlt Scott Meyers wann immer möglich const zu verwenden. Das erhöht die Lesbarkeit von code und macht ihn mit unter auch fehlerresistenter!

    QED, meine Herren

    lol 😃

    so, hier mal die assembler-entsprechung für deinen referenz-kram (ein bisschen vereinfacht dargestellt):
    by-value:

    ; aufrufer
    push  eax ; argument übergeben
    
    ; in der funktion
    
    pop   eax ; *hust* double hat ja nur 32 bits...
    

    by-reference

    ; aufrufer
    push   eax ; erstmal auf den stack pushen, weil die register ja überschrieben werden
    ; ...
    push   ebx + 4 ; adresse übergeben
    
    ; funktion
    
    pop   ebx      ; adresse holen
    mov   eax, [ebx] ; wert an adresse in ebx nach eax schreiben
    

    ich hoffe, dass ich mich gerade richtig an mein asm-tut erinnert hab... 🙄

    das mit dem const stimmt schon, aber const macht alles nur unnötig schwerer bei bult-ins.



  • ChrisPlusPlus schrieb:

    Tut mir leid! Nun, ich fand diesen Einwand einfach nur doof!

    Der Einwand musste kommen, wenn du mit besonderem Hinweis auf Sauberkeit behauptest, dass dein Code doubles prüft.

    Wäre es nicht das C++-Forum, hätte ich ASSERT selbstverständlich vorgeschlagen.

    assert gibt's im Standard. #include <cassert>.


Anmelden zum Antworten