Wo liegt der Fehler????

Neue Frage »

Auf diesen Beitrag antworten »
Butterblume Wo liegt der Fehler????

Ich habe ein Programm geschrieben in C.

Es soll zwei (vorher vom Nutzer eingegebene) Kommazahlen addieren.

Der Witz bzw. das Problem ist, wenn die Summe eine ganze Zahl ist, soll es "ohne"

Nachkommastellen ausgegeben werden, zB 1.23 + 3.77 = 5.

Wenn es eine Nachkommastelle gibt, dann soll die Summe eben mit einer Nachkommastelle ausgegeben werden usw...bis zur 3. Nachkommastelle! Alle sonstigen Zahlen dann eben nur noch mit 3 Nachkommastellen.

Das Programm sieht so aus:

#include <stdio.h>
int main(){
double k1, k2, summe, rest, rest1, rest2, rest3, rest4;
printf(Bitte geben Sie eine Zahl ein: ");
scanf("%lf", &k1);
printf(Bitte geben Sie noch eine Zahl ein: ");
scanf("%lf", &k2);
summe = k1 + k2;
rest = summe - (int)summe;

if(rest ==0){
printf("Die Summe ist %.0f\n", summe);
}else{
rest1 = rest*10;
rest2 = rest1 - (int)rest1;
if(rest2 ==0){
printf("Die Summe ist %.1f\n", summe);
}else{
rest3 = rest2 * 10;
rest4 = rest3 - (int)rest3;
if(rest4 ==0){
printf("Die Summe ist %.2f\n", summe);
}else{
printf("Die Summe ist %.3f\n", summe);
}
}
}
return 0;
}

Aus einem mir nicht erkennbaren Grund gibt das Programm immer - egal was ich eingebe - eine Zahl mit 3 Nachkommastellen aus!

ich bin verzweifelt unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich unglücklich
 
Auf diesen Beitrag antworten »
NixJava

Das scheint ein Problem der Floating-Point-Arithmetik zu sein. Die Gleitkommaeinheit (FPU) kann manche Gleitkommazahlen (wie beispielsweise 0.1) nicht exakt darstellen. Man glaubt, eine Variable f enthalte nach einigen Rechnungen den exakten Wert 1.0, aber in Wirklichkeit ist es 0.999irgendwas. Somit ist dann auch (int)f = 0 und nicht 1.

Zitat:
Wenn es eine Nachkommastelle gibt, dann soll die Summe eben mit einer Nachkommastelle ausgegeben werden usw...bis zur 3. Nachkommastelle! Alle sonstigen Zahlen dann eben nur noch mit 3 Nachkommastellen.

Schau dir mal den Platzhalter %g an.
Auf diesen Beitrag antworten »
Butterblume

Ich soll nur float, double oder int benutzen.

Das Problem liegt an einem Fehler im Algorithmus...ich kann ihn nur nicht finden unglücklich
Auf diesen Beitrag antworten »
CombatWombat

NixJava hat schon recht. Das liegt an der nicht exakten Darstellung.

Zwei Tipps für die Zukunft.

1. Bei der Fehlersuche debuggen, dabei ist sogenanntes printf debugging das einfachste.
Hierbei gibst du einfach bei jedem Schritt die Werte über printf aus, in diesem fall dann einfach mit printf("%f", restX) und guckst was bei rauskommt. Dabei siehst du, dass auch wenn du 0 erwarten würdest manchmal 0.00000001 oder ähnliches als Ergebnis herauskommt. Die andere Variante ist ein Debugger, bei C der GDB.

2. Du wiederholst hier 3x die gleichen Schritte, das Programm wäre schöner und besser lesbar, wenn du ne Schleife nutzen würdest.

Zur Lösung deines Problems:

#include <stdio.h>
int main(){
double k1, k2, summe, rest, rest1, rest2, rest3, rest4;
printf("Bitte geben Sie eine Zahl ein: ");
scanf("%lf", &k1);
printf("Bitte geben Sie noch eine Zahl ein: ");
scanf("%lf", &k2);
summe = k1 + k2;
rest = summe - (int)summe;

if(rest <= 0.0000001){
printf("Die Summe ist %.0f\n", summe);
}else{
rest1 = rest*10;
rest2 = rest1 - (int)rest1;
if(rest2 <= 0.0000001){
printf("Die Summe ist %.1f\n", summe);
}else{
rest3 = rest2 * 10;
rest4 = rest3 - (int)rest3;
if(rest4 <= 0.0000001){
printf("Die Summe ist %.2f\n", summe);
}else{
printf("Die Summe ist %.3f\n", summe);
}
}
}
return 0;
}
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »