Potenz als Integer



  • Der folgende berechnet eine Array, für eine 7-Segment Anzeiger.
    Anstelle, das ich jede Ziffer einzeln berechne, will ich dies in einer Schleife lösen.
    Aber ich finde es übertrieben, das pow() ein double als Ergebniss liefert, da ich nur einen Integer brauche.
    Gibt es dafür eine elegante Lösung ? 😉
    Übrigens ist dieser Code für einen Arduino.

    const unsigned char digits[] = {
    		0B00111111,  // = 0
    		0B00000110,  // = 1
    		0B01011011,  // = 2
    		0B01001111,  // = 3
    		0B01100110,  // = 4
    		0B01101101,  // = 5
    		0B01111101,  // = 6
    		0B00000111,  // = 7
    		0B01111111,  // = 8
    		0B01100111,  // = 9
    		};
    
    const unsigned char maxSegment = 16;
    unsigned char digit[maxSegment];
    
    void displayNumber(int n) {
    	n = abs(n);
    	for (char i = 0; i <= 4; i++) {
    		digit[i] = digits[n % round(pow(10, i) * 10) / round(pow(10, i))];
    	}
    
    //	digit[0] =digits[ n % 10 / 1];
    //	digit[1] =digits[ n % 100 / 10];
    //	digit[2] =digits[ n % 1000 / 100];
    //	digit[3] =digits[ n % 10000 / 1000];
    //	digit[4] =digits[ n % 100000 / 10000];
    }
    


  • Du hast doch auskommentiert schon eine andere Lösung.

    Die kannst du problemlos in eine Schleife wandeln. Die Ziffer ist die Zahl modulo 10. Dann teilst du die Zahl durch 10 und machst von vorne weiter, solange die Zahl > 0 ist (oder solange du bis 4 gezählt hast oder wie viele Ziffern du halt anzeigen kannst).



  • Schau mal bei https://www.c-plusplus.net/forum/337998 , wo es um itoa geht. Das ist deinem Problem sehr ähnlich.



  • DirkB schrieb:

    Schau mal bei https://www.c-plusplus.net/forum/337998 , wo es um itoa geht. Das ist deinem Problem sehr ähnlich.

    Der Umweg über einen String, wäre eine gute Lösung.
    Dann könnte man auch Zahlen wie 1.23345E23 darstellen.

    In C++ gibt es sicher auch eine Funktion wie FloatToStr, so wie es sie in Pascal gibt ?



  • Mathuas schrieb:

    In C++ gibt es sicher auch eine Funktion wie FloatToStr, so wie es sie in Pascal gibt ?

    Es gibt eine Funktion to_string, die alle arithmetischen Typen in einen String umwandelt.



  • Was spricht gegen

    for (int i = 0, j = 10; i < 5; ++i) {
    	digit[i] = digits[n % j / (j / 10)];
    	j *= 10;
    }
    

    ?



  • MatzeHHC schrieb:

    Was spricht gegen

    for (int i = 1, j = 10; i <= 5; ++i) {
    	digits[i] = digits[n % j / (j / 10)];
    	j *= 10;
    }
    

    ?

    Die falschen Indizes vom Array, zuviel Rechnerei

    Für Positive n:

    for (int i = 0; i < 5; ++i) {
        digits[i] = n % 10;
        n /=  10;
    }
    


  • DirkB schrieb:

    Die falschen Indizes vom Array

    Stimmt, habs korrigiert.

    DirkB schrieb:

    zuviel Rechnerei

    Stimmt auch.

    Ich wollte die Diskussion von dem to_string-Mist weglenken...


Log in to reply