Forum: Mikrocontroller und Digitale Elektronik AVR C Float-Berechnung


von Martin F. (martin_f70)


Lesenswert?

Hallo, ich habe volgendes Problem:
1
    admw[1] = 813;
2
    admw[0] = 828;  
3
    double wert;
4
    wert = (7.0-4.0)/(admw[1]-admw[0]);   
5
    sprintf(buffer, "s=%4.2f    ", wert);
6
    lcd_string(buffer);

Auf dem Display wird immer nur 0.00 ausgegeben.
Warum ist das so?

von Irgendwer (Gast)


Lesenswert?

und von welchem Type ist admw?

von Mobus (Gast)


Lesenswert?

Die Floatingpointlibrary wird vermutlich nicht gelinkt. Einfach im 
Handbuch deines Compilers nachschauen.

von Martin F. (martin_f70)


Lesenswert?

Es liegt an der Division. Bei 1/3 zeigt er auch 0.00 an. Ich nutze einen 
ATmega328p , Was muss ich tun um den fehler zu korrigieren?

von hp-freund (Gast)


Lesenswert?

Martin Fischer schrieb:
> Was muss ich tun ...

Die beiden Antworten beachten.

Uns die Fehlermeldungen/Warnungen verraten.

von hp-freund (Gast)


Lesenswert?

Und natürlich die richtigen Datentypen benutzen!

1/3 ist nicht das Gleiche wie 1.0/3.0

von Kaj (Gast)


Lesenswert?

Martin Fischer schrieb:
> Hallo, ich habe volgendes Problem:
>     admw[1] = 813;
>     admw[0] = 828;
>     double wert;
>     wert = (7.0-4.0)/(admw[1]-admw[0]);
>     sprintf(buffer, "s=%4.2f    ", wert);
>     lcd_string(buffer);
>
> Auf dem Display wird immer nur 0.00 ausgegeben.
> Warum ist das so?
Gabs hier nicht schon mal so einen Fred von einem Herrn Martin Fischer, 
wo gefühlt tausend mal erklärt wurde, das die entsprechende Lib gelinkt 
werden muss? Ich bin mir ziemlich sicher, das dem so war...

von Kaj (Gast)


Lesenswert?

Beitrag "AVR-C double gibt auf LCd nur aus"
Da wurde deine Frage mehr als ausreichend und auch viel zu oft 
beantwortet

von Ralph S. (jjflash)


Lesenswert?

na ja, dieses mal wird er wohl die Bibliothek hinzugelinkt haben, weil
er ja "0.00" (anstelle eines "?") erhält.

Der Compiler macht während des Umrechnens bei bspw. einer
Integerdivision KEINE Typumwandlung.

Eine Disvision der Art:

int z1;
int z2;

float ergeb;

wird bei:

z1= 6; z2= z2;
ergeb= z1 / z2;

für "ergeb" 0.00 ausgeben, weil das "richtige" Ergebnis 0.5 eben kleiner
1 ist und der Nachkommateil abgeschnitten wird.

Um hier eine "korrekte" Anzeige zu erhalten muß bei der Rechnung das
Typergebnis mit angegeben werden:

ergeb= (float)(z1 / z2);

von Klaus W. (mfgkw)


Lesenswert?

zumindest im OP steht aber:

Martin Fischer schrieb:
> wert = (7.0-4.0)/(admw[1]-admw[0]);

Damit ist das Abschneiden von Nachkommastellen durch Ganzzahlrechnung 
nicht das Problem.

Vorausgesetzt, der Quelltext ist wirklich der betreffende.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.