pow ersetzen



  • Fellhuhn schrieb:

    asc schrieb:

    Niemals Makros als Funktionsersatz...

    Wenn man etwas nicht einsetzen sollte, nur weil man damit Blödsinn machen kann, dürfte man gar nichts verwenden.

    Das hat nichts mit "Blödsinn machen" zu tun. Das ist einfach eine Frage der korrekten Funktion.
    Makros sind eine stumpfe Textersetzung - ohne Rücksicht auf sprachliche Feinheiten wie Scope oder Parameter-Übergaben. Und dadurch mußt du sehr genau aufpassen, was du übergeben kannst.

    Um mal das Quadrieren als Beispiel zu nehmen - deinem #define sqr(x) ((x)*(x)) kannst du keine Ausdrücke mit Nebeneffekten übergeben und brauchbare Ergebniss erwarten - und ich kenne auch keine Makro-Alternative, um das hinzubekommen. Im Gegensatz dazu hat template<typename T> inline T sqr(T val) {return val*val;} die selbe Wirkung, aber keins der Probleme des Makros.



  • LordJaxom schrieb:

    Reicht nicht schon das Standardbeispiel min/max zur Abschreckung?

    Schlechtes Beispiel. min/max ist nun gerade einer der Fälle, wo ein Macro tatsächlich Vorteile hat. Siehe http://www.ddj.com/cpp/184403774

    #include <windows.h>
    #include <algorithm>
    

    =>

    #include <windows.h>
    #undef max
    #undef min
    #include <algorithm>
    

    Zugegeben, wenn man das nicht weiß, resultieren einige echt eklige Bugs.



  • hmm man soll

    #define NOMINMAX
    

    nutzen, wobei dann wieder alle anderen Microsoft-Header streiken 😛 Also ist nen bissel doof und am einfachsten wirklich durch #undef NACH allen Microsoft-Headern zu lösen ...



  • Ich kenne die Umgehungsmöglichkeit, wollte auch nur auf das Problem hinweisen. Und das Makro NOMINMAX gab es bestimmt nicht von Anfang an (➡ Bekämpfung der Symptome)



  • hmpf ich glaub ich hätte besser mal die aufgabenstellung mit gepostet:

    Zahlenkonvertierung
    Schreiben Sie ein C++-Programm, das positive, ganze Dezimalzahlen in die
    entsprechenden Dualzahlen und Oktalzahlen umrechnet.
    Hinweise, verbindlich:
    - Die Umwandlung in Dualzahlen muss nach der Potenzenmethode, die
    Umrechnung in Oktalzahlen nach der Restwertmethode erfolgen.
    - Speichern Sie die Ergebnisse in Strings.
    - Benutzen Sie einen String-Vektor, um die Ziffern des Oktalsystems zu speichern:
    string oktalziffer[8]={"0","1","2","3","4","5","6","7"};
    - Der Modulo-Operator % gibt den ganzzahligen Rest der Integer-Division zweier
    Zahlen zurück:
    11 % 4 = 3
    - Die Integer-Division / schneidet die Nachkommastellen des Divisionsergebnisses
    ab:
    9 / 2 = 4
    Testlauf (Eingaben unterstrichen):
    Dezimalzahl = ? 255
    Umrechnung einer ganzzahligen, positiven Dezimalzahl in
    - eine Dualzahl nach der Potenzenmethode : Dualzahl = 11111111
    - eine Oktalzahl nach der Restwertmethode: Oktalzahl = 377
    Press any key to continue



  • Die Lösung wurde doch schon genannt (auch wenn sie in der anschließenden Diskussion über Makros vs. Inline-Funktionen untergegangen ist). Du brauchst dort nur Potenzen von 2 ( pow(2,i); und dazu reicht der Shift-Operator völlig aus:

    inline int exp2(int x)
    { return 1<<x; }
    
    ...
    int i,j;//Gleitkomma-Werte sind hierfür überflüssig
    ...
    for(i=0; i<=16; i++) 
    { 
      j = exp2(i);// j = pow(2,i);
      if(inp_du < j) 
        break; 
    } 
    ...
    


  • ODer einfach auf die erste Seite auf meine Beiträge achten und mal die anderen gekonnt außer acht lassen ...



  • 2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab 🙂

    inline int exp2(unsigned int x)
    { return (x==0)? (1): (1<<x); }
    

    edit: Das ist natürlich Unsinn 🤡



  • Badestrand schrieb:

    2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab 🙂

    Ja - und 1<<0 ergibt rein zufällig auch 1, also erübrigt sich deine Fallunterscheidung 😉



  • CStoll schrieb:

    Badestrand schrieb:

    2^0 ist doch 1, jedenfalls als ich noch Mathe gelernt hab 🙂

    Ja - und 1<<0 ergibt rein zufällig auch 1, also erübrigt sich deine Fallunterscheidung 😉

    Ups 😃
    Ich hab irgendwie an.. irgendwas anderes gedacht 😕



  • ok, danke ich habs jetzt verstanden und es funktioniert auch.
    und viel spaß noch beim diskutieren 😃


Anmelden zum Antworten