Forum: Compiler & IDEs Problem mit Gleitkommazahlen ( -0.00005802 )


von Jakob (Gast)


Lesenswert?

Hi, wollte mal kurz ein kleines C Programm machen, nun ist es aber schon 
etwas länger her als ich das letzte mal C in Konsolen Form verwendet 
habe.

Frage ist nur funktioniert dies hier überhaupt ?

Funktion liest sich ja raus, er soll mir die Spannung übern PTC 
rausgeben bei einer bestimmten Temp.

Frage ist nun, schafft long double überhaupt -0.00005802 oder was nehme 
ich dort am besten.
1
long double WiderstandPTC;
2
  long double Temp;
3
  long double SpannungPTC;
4
  long double Reff;
5
  long double Vorwiderstand;
6
  long double Strom;
7
  long double ZwischenWert1;
8
  long double BitWert;
9
10
  printf("Spannung fuer den ADC berechnen !\n");
11
  printf("Geben sie hier die benoetigten Groessen ein...\n");
12
  printf("\nRefferenz Spannung : ");
13
  scanf("%Lf",&Reff);
14
  printf("\nTemperatur : ");
15
  scanf("%Lf",&Temp);
16
  printf("\nVorwiderstand : ");
17
  scanf("%Lf",&Vorwiderstand);
18
19
20
  WiderstandPTC = -0.00005802*(Temp*Temp)+0,390802*Temp+100;
21
  Strom = Reff/(WiderstandPTC+Vorwiderstand);
22
  SpannungPTC = WiderstandPTC*Strom;
23
24
25
  ZwischenWert1=1024/Reff;
26
  BitWert=ZwischenWert1*SpannungPTC;
27
28
  printf("\n\nSpannung am PTC betraegt : %Lf",SpannungPTC);
29
  printf("\nBitwert = %Lf",BitWert);

von ASCII (Gast)


Lesenswert?

einfach ausprobieren?

von Martin M. (martinm_de)


Lesenswert?

long  double klingt  nach 128 bit

32 bit  (float?)  sollte locker reichen

von Peter II (Gast)


Lesenswert?

> 0,390802

und

> -0.00005802

was ist da wohl anders ....

von Karl H. (kbuchegg)


Lesenswert?

Jakob schrieb:

> Frage ist nun, schafft long double überhaupt -0.00005802 oder was nehme
> ich dort am besten.

Ein normaler double tut es auch. 15 bis 16 signifikante Stellen sollten 
dicke ausreichen.

Und wenn du dann hier

>   WiderstandPTC = -0.00005802*(Temp*Temp)+0,390802*Temp+100;

auch noch korrekterweise einen Dezimalpunkt anstelle eines Kommas 
verwenden würdest, dann würden die Zahlenwerte sogar stimmen.

von Oliver (Gast)


Lesenswert?

Jakob schrieb:
> Frage ist nur funktioniert dies hier überhaupt ?

Was genau willst du jetzt wissen, und was genau verlangst du jetzt vom 
geneigten Forenuser?

Kompilier das Programm, und schau, was passiert. Lässt es sich nicht 
kompilieren, gibt es Fehlermeldungen, die dir weiterhelfen. Lässt es 
sich nicht linken, dito. Lässt es sich kompilieren und linken, lass es 
halt laufen, und schau, was es macht.

Jakob schrieb:
>Frage ist nun, schafft long double überhaupt -0.00005802 oder was nehme
>ich dort am besten.

Um das genauer zu beantworten, musst du in der Doku zu genau dem gcc 
nachlesen, den du verwendest. Die Datentypenbreite ist 
plattformabhängig.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oliver schrieb:
> Um das genauer zu beantworten, musst du in der Doku zu genau dem gcc
> nachlesen, den du verwendest.

Nein, selbst ein simpler 32-bit-float reicht dafür locker aus, denn
es sind gerade mal vier signifikante Dezimalstellen gefragt (float
hat 6...7, und der C-Standard fordert von double mehr als diese).

von Kris M. (kristijan_m)


Lesenswert?

Also erstmal.. warum überhaupt Float benutzen? macht dein Programm nur 
langsamer... Kannst du das vermeiden? Wenn es nur um die letzten 4-5 
stellen geht.. Multipliziere den mist den du irgendwoher bekommst so 
gescheit, dass du am ende statt 0,00000xxxx einfach xxxx da stehen hast.

Floats sollte man eigentlich, wenn man es kann, vermeiden.

von Jakob (Gast)


Lesenswert?

Ich schließe das ganze.
War nur der . mit einen , vertauscht und benutze doch etwas andere 
Sensoren.
Funktionieren tut das ganze ;D

von Kris M. (kristijan_m)


Lesenswert?

z.b. kannst du dann sowas hier machen

printf("\n\nSpannung am PTC betraegt : 0,0000%Lf",SpannungPTC);

somit gibts du das Kommata und die Nullen einfach als Text vor.

von Kris M. (kristijan_m)


Lesenswert?

Jakob schrieb:
> Ich schließe das ganze.
> War nur der . mit einen , vertauscht und benutze doch etwas andere
> Sensoren.
> Funktionieren tut das ganze ;D

Macht dein Programm trotzdem nicht gut.. und vor allem groß wie Sau

Kann man eleganter lösen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kris M. schrieb:
> Kann man eleganter lösen

Aha.  Das weißt du so, ohne den Rest seiner Daten zu kennen?

Du bist wirklich gut, wenn du das kannst. :-)

Im Übrigen dürfte es hier ausnahmsweise mal nicht um AVRs gehen
(die haben sowieso weder ein ernstzunehmendes "long double" noch
ein scanf-Format dafür), sondern schätzungsweise eher um normale
PCs.  Diese wiederum haben seit dem i486 inhärent eine
Gleitkommaeinheit, es kann dann gut sein, dass das Skalieren vieler
Integer-Zahlen sogar ressourcenintensiver ist als das bisschen
Gleitkomma.

Aber das nur nebenbei.  Selbst auf einem AVR kann Gleitkomma gut und
gern die bessere Wahl sein, wenn es nämlich die Dynamik der Daten
verlangt.  Ob das der Fall ist, kann man mit den paar Codezeilen
überhaupt nicht abschätzen.

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.