Problem mit Gleitkommazahlen ( -0.00005802 )

Gast #3660821
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);
#3660837
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.
Gast #3660839
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
#3660879
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.
Moderator Persönliche Seite #3660948
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.

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