dsPIC C30 einfache Prozentrechnung

Gast #1235071
>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 #1235228
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.


Gruß Mempo
Gast #1235234
>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
>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 #1235275
>int geht aber nur bis 32768. unsigned int bis 65535.

Bevor jemand meckert:
Ein int ist nicht immer 16Bit breit.
Auf 32Bit uC ist ein int auch meist 32 Bit.
int kann aber auch 64Bit sein.
Gast #1235277
Okay danke für den kleinen C Nachhilfekurs, ist diese Schreibweise in 
Programmen gebräuchlich oder ist es eleganter vorher den richtigen Typ 
festzulegen?
Gast #1235285
>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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.