- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 12

Thema: Berechnung falsch

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256

    Frage Berechnung falsch

    Hallo
    ich möchte auf meinem AVR folgende Rechnung durchführen.
    Code:
     
    uint16_t line_estimate = 0;
    uint32_t wa_numerator = 0;
    uint16_t wa_denominator = 0;
    
    uint16_t line_values[8];  //Werte zwischen 0...1023
    
    [...] //line values werden eingelesen und befüllt
    
     for(uint8_t i=0;i<8;i++)
    {
      wa_numerator += line_values[i] * (i+1) *1000;
      wa_denominator += line_values[i];
    }
    
    line_estimate = wa_numerator/wa_denominator;
    
    //Ausgabe
    char buffer[20];
        lcd_puts(itoa(line_estimate, buffer, 10));
    Allerdings funktioniert das nicht richtig. Wenn z.b alle Elemente von line_values 0 sind und nur das 1 einen anderen Wert hat müsste line_estimate 1000 sein, es schwankt aber nur "wild" hin und her und erreicht zeitweise negative bzw. Werte kleiner 1000 die es niemals erreichen dürfte. Meine Vermutung ist das ich noch irgendwo "typecasten" muss, ich weiss aber nicht wo
    Hat irgendjemand eine Erklärung für dieses seltsame Verhalten bzw. kann mir sagen wo der Fehler liegt?
    Geändert von Chypsylon (12.02.2012 um 18:40 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Diese Berechnung
    Code:
    line_values[i] * (i+1) *1000
    erfolgt in uint16_t. Für line_values[7] z.B. läuft das schon für alles >8 über.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Zitat Zitat von sternst Beitrag anzeigen
    Diese Berechnung
    Code:
    line_values[i] * (i+1) *1000
    erfolgt in uint16_t. Für line_values[7] z.B. läuft das schon für alles >8 über.
    Deswegen ist wa_numerator ja auch als 32bit deklariert?

    Code:
     
    uint32_t wa_numerator = 0;
    ...
    wa_numerator += line_values[i] * (i+1) *1000;
    Oder seh ich grad den Wald vor lauter Bäumen nicht

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Chypsylon Beitrag anzeigen
    Deswegen ist wa_numerator ja auch als 32bit deklariert?
    Und?
    Der Typ auf der linken Seite einer Zuweisung hat keinerlei Einfluss darauf, wie auf der rechten Seite der Ausdruck ausgewertet wird.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Ich hab auch schon probiert die rechte Seite als long zu casten, hat aber nicht wirklich was geändert...

    Code:
    wa_numerator += (long)(line_values[i]) *((i+1) *1000);
    bzw.
    wa_numerator += (long)(line_values[i] *((i+1) *1000));

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Was soll das "bzw." denn bedeuten? Die beiden Zeilen sind in ihrem Verhalten grundverschieden. Was genau hast du denn nun ausprobiert?
    MfG
    Stefan

Ähnliche Themen

  1. Berechnung des DMS
    Von Unregistriert im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 21.02.2012, 18:10
  2. Antworten: 5
    Letzter Beitrag: 07.08.2008, 16:38
  3. CTC- Falsche Berechnung
    Von Spurius im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 24.07.2008, 21:49
  4. NTC-Berechnung
    Von Easter im Forum Sensoren / Sensorik
    Antworten: 10
    Letzter Beitrag: 04.05.2008, 17:57
  5. LED Berechnung
    Von mg im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 30.03.2006, 13:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen