dsPIC C30 einfache Prozentrechnung

Gast #1235071
Lesenswert?
• ▲
▼
>Wenn ich zum Beispiel x=(100*3000)/4000; rechne bekomme ich als Ergebnis
>-6 die Variable ist als Integer deklariert.

Wenn ein Integer bei deinem uC 16 Bit breit ist hast
du einen Überlauf: 100*3000 = 300000
Gast #1235234
Lesenswert?
• ▲
▼
>Danke für die Antwort so dachte ich mir das auch aber wenn ich die
>Variable zum beispiel als double oder so etwas deklariere bekomme ich
>immer noch ein falsches Ergebnis.

Welche Variable hast du als double deklariert? prozent?
Die Rechnung ist dann immer noch falsch.
prozent kriegt nur das Ergebnis zu sehen.


Probier mal:

prozent = (100UL * anzahl) / gesamt;
Gast #1235266
Lesenswert?
• ▲
▼
>Ja das klappt ja jetzt auch alles, nur frage ich mich was das UL
>bedeutet.

Das UL macht aus der 100 ein unsigned long.
Das Ergebnis der Multiplikation ist dann auch
ein unsigned long. 300000 passt somit in das Ergebnis.
Lässt man das UL weg ist die 100 ein int.
Das Ergebnis der Multiplikation somit auch ein
int weil vermutlich auch anzahl ein int oder unsigned int ist.
int geht aber nur bis 32768. unsigned int bis 65535.
300000 passt also nicht in das Ergebnis der Multiplikation
von int/unsigned int.
Gast #1235285
Lesenswert?
• ▲
▼
>Okay danke für den kleinen C Nachhilfekurs, ist diese Schreibweise in
>Programmen gebräuchlich oder ist es eleganter vorher den richtigen Typ
>festzulegen?

Wenn prozent, anzahl, gesamt jeweils in ein int passen
dann ist das mit den 100UL besser. Dann wird nur diese
eine Berechnung als unsigned long ausgeführt. Machst du
prozent, anzahl, gesamt zu unsigned long dann belegen
sie doppelt soviel RAM falls ein int 16Bit ist.
Gast #1292704
Lesenswert?
• ▲
▼
und was ist jetzt mit dem Überlauf?

Angenommen 32Bit Prozessor, wenn ich eine Prozentrechung habe:
kann man natürlich auch auf einen 16- oder 8- Bitter haben,
dann halt long durch short bzw. char ersetzen.

char Prozent(long lAkt, long lGes)
{

   unsigned long ulAkt,ulGes,ulRet;
   if(lAkt< 0)
   {
     ulAkt= (~lAkt);
   }else{
     ulAkt= (lAkt);
   }
   if(lGes< 0)
   {
     ulGes= ~lGes;
   }else{
     ulGes= (lGes);
   }

    if(ulGes == 0)
    {
        return 0;
    }
    else
    {
       ulRet = (ulAkt*100) / ulGes;
    }

    if(ulRet > 0xFF)
    {
        return 0xFF;
    }
    else
    {
        return (uint8)ulRet;
    }
}

int main(void) {
    char cPercent = 0;
    long lAkt = 0;
    long lGes = 0;


    //(1)Testfall 1: MIN_INT32,MIN_INT32 ergibt 0 statt 100 \n");
    lAkt = INT_MIN;
    lGes = INT_MIN;
    cPercent = Prozent(lAkt, lGes);

return 0;
}


MfG
Mel

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren