Forum: PC-Programmierung Problem mit Datentypen in C


von mucho (Gast)


Lesenswert?

Habe ein simples Programm geschrieben doch die ausgabe in Grad Celsius 
ist immmer 0.0000

Habe schon alles mögliche Probiert wie man im code sieht. wo liegt das 
Problem?

1
printf("\n***** 2) F in C umrechnen*******");
2
    printf("\ngeben Sie die Temperatur in Fahrenheit ein: ");
3
    scanf("%Lf",&F);
4
    //Berechnung
5
    long double c;  
6
           long double a=5/9;
7
    long double b=F-32;
8
    c=a*b;
9
10
11
    
12
    //c=((5/9)*(F-32));
13
    printf("\n%Lf Fahrenheit sind %Lf Celsius\n",F,c);

---

Bitte Code in [ c ] / [ /c ]-Tags einschließen. "[code]" gibt es hier 
nicht.

-rufus

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

mucho schrieb:
> long double a=5/9;

5/9 wird als int gerechnen ist damit immer 0.
1
long double a=5f/9f;

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> 5/9 wird als int gerechnen ist damit immer 0.
> long double a=5f/9f;

Nein, so geht's nicht, denn der Suffix f dient dazu, aus einer 
Floatingpoint-Konstante einen float statt den defaultmäßigen double zu 
machen. 5 und 9 sind aber Integerkonstanten. Es müßte dann also schon 
5.0f (oder wenigsten 5.f) heißen, was aber schlecher ist, als den Suffix 
ganz wegzulassen, da die Division dann nur in float, ohne Suffix aber in 
double gerechnet wird. Wenn das Ergebnis wirklich long double sein soll, 
müßte es aber 5.0l/9.0l heißen.

von mucho (Gast)


Lesenswert?

Und wieso wird es als int gerechnet?

Wenn ich a=5f/9f eingebe kommt:
error: invalid digit 'f' in decimal constant long double a=5f/9f;

Wie müsste ich die ganzen Variablen deklarieren? Ich dachte Anfangs ein 
float reicht aus für alle Variablen, da es nicht ging habe ich mich hoch 
gearbeitet bis long double.

von Peter II (Gast)


Lesenswert?

mucho schrieb:
> Und wieso wird es als int gerechnet?

weil das in C so festgelegt ist.

aber mein Fehler hat ja Rolf Magnus schon gefunden.

kannst auch
1
long double a=5.0/9.0;

schreiben.

von mucho (Gast)


Lesenswert?

Ich danke euch es klappt. Aber welcher Datentyp ist an dieser Stelle am 
besten geeignet?

Und das Problem an sich habe ich leider noch nicht verstanden unter was 
muss ich nachschlagen? Oder ist es so das alle Brüche als Integer 
dargestellt werden obwohl sie als zum Beispiel double deklariert sind?

von Carl D. (jcw2)


Lesenswert?

Wozu braucht man denn bein "Fahrenheit nach Celsius" die 19 
signifikanten Stellen eines "long double"?
Wenn man beim Messen mehr als 3..4 Stellen haben will, da wird's teuer.
"double" hat übrigens 15, "float" immer noch 7 signifikante Stellen, 
also jenseits 1000 Grad auf's Milligrad genau!
Wobei auf dem PC weder vom Speicherverbrauch, noch von der 
Geschwindigkeit etwas gegen "double" sprechen würde, es geht mir 
vielmehr darum klar zu machen was die 19 Stellen einer so umgerechneten 
Temperatur bedeuten: nach der 3..4 Stellen gar nichts mehr!

von g457 (Gast)


Lesenswert?

> Oder ist es so das alle Brüche als Integer
> dargestellt werden obwohl sie als zum Beispiel double deklariert sind?

Du bellst Den falschen Baum an: Du hast den Bruch (die ∗Berechnung∗) 
eben nicht als double deklariert, sondern als Integer. Nur das 
∗Ergebnis∗ (also nach der Berechnung) hast du als (long) double 
deklariert. Kleiner aber feiner Unterschied.

HTH

von Carl D. (jcw2)


Lesenswert?

mucho schrieb:
> Und das Problem an sich habe ich leider noch nicht verstanden unter was
> muss ich nachschlagen? Oder ist es so das alle Brüche als Integer
> dargestellt werden obwohl sie als zum Beispiel double deklariert sind?

Zwei Integerzahlen werden in C erst dann automatisch nach Floatingpoint 
konvertiert, wenn es wirklich nötig ist. Int / Int wird als Int 
gerechnet, erst die Zuweisung an Double konvertiert. Sobald eine 
beteiligte Zahl als FloatingPoint niedergeschrieben wird, ist auch die 
Division FloatingPoint. Zu lesen in jedem ordentlichen C-Buch ;-)

von DirkB (Gast)


Lesenswert?

mucho schrieb:
> Oder ist es so das alle Brüche als Integer
> dargestellt werden obwohl sie als zum Beispiel double deklariert sind?

Weil beide an der Divison beteiligten Typen Integer sind.
Dabei ist es egal, was links vom = steht.

mucho schrieb:
> Aber welcher Datentyp ist an dieser Stelle am
> besten geeignet?

double

Du kannst auch
1
#define FAHRENHEIT2CELSIUS(f) (((f)-32)*5/9)
machen.
Dann hängt die Rechnung vom Typ von f ab.

von Hans (Gast)


Lesenswert?

mucho schrieb:
> Und das Problem an sich habe ich leider noch nicht verstanden unter was
> muss ich nachschlagen? Oder ist es so das alle Brüche als Integer
> dargestellt werden obwohl sie als zum Beispiel double deklariert sind?

5 ist ein int.
9 ist ein int.
Eine Rechenoperation mit zwei ints ergibt wieder einen int.
5/9 ergibt 0.

An welche Art von Variable Du das Ergebnis zuweist, spielt an der Stelle 
keine Rolle. Bei der Zuweisung an einen double wird der Integer 0 in 
einen Double 0.0 konvertiert. Da ist es schon zu spät.

Dagegen gilt:
5.0 ist ein double.
9.0 ist ein double.
Eine Rechenoperation mit zwei doubles ergibt wieder einen double.
5.0/9.0 ergibt 0.55555...

von mucho (Gast)


Lesenswert?

Hans schrieb:
> Dagegen gilt:
> 5.0 ist ein double.
> 9.0 ist ein double.
> Eine Rechenoperation mit zwei doubles ergibt wieder einen double.
> 5.0/9.0 ergibt 0.55555...

Danke euch, verstehe es nun. Aber wie der Kollege schon sagte macht ja 
double kein Sinn für Temperaturen, wie mache ich float aus dem Bruch?

von Carl D. (jcw2)


Lesenswert?

De "Kollege" sprach von der speziellen Version "long double", die dem 
internen FP-Format der x86 CPUs entspricht und wollte nur klarstellen 
daß mehr manchmal gar nicht gebraucht wird. Wer "long double" 
schreibt, hat doch sicher irgendwo den Tip bekommen, daß das besser sei 
;-)

>  wie mache ich float aus dem Bruch?

indem eine der Zahlen erkennbar FP ist also z.B. einen Dezimalpunkt hat. 
Der Compiler rechnet das sowieso in eine Konstante um, die er dann der 
Variablen zuweist.

: Bearbeitet durch User
von DirkB (Gast)


Lesenswert?

Der Compiler rechnet die einzelnen Schritte in der "höherwertigsten" 
Rechenart (Integer < double < long double).

ein 5./9 oder 5/9. reicht da schon.

Aber Achtung:
Bei 5/9*3.1 wird erst 5/9 als int gerechnet.
Bei 3.1*5/9 wird erst 3.1*5 als double gerechnet. Das Ergebnis ist 
wieder double und so wird auch 15.5*9 als double gerechnet.

Es kommt also auch auf die Reihenfolge an.

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.