Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Informatik in der Schule » Wo liegt der Fehler???? » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Wo liegt der Fehler????
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Butterblume
Grünschnabel


Dabei seit: 19.04.2020
Beiträge: 7

Wo liegt der Fehler???? Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Butterblume: 19.04.2020 18:07.

19.04.2020 18:06 Butterblume ist offline Beiträge von Butterblume suchen Nehmen Sie Butterblume in Ihre Freundesliste auf
NixJava
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
19.04.2020 20:24
Butterblume
Grünschnabel


Dabei seit: 19.04.2020
Beiträge: 7

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich soll nur float, double oder int benutzen.

Das Problem liegt an einem Fehler im Algorithmus...ich kann ihn nur nicht finden unglücklich
20.04.2020 19:00 Butterblume ist offline Beiträge von Butterblume suchen Nehmen Sie Butterblume in Ihre Freundesliste auf
CombatWombat
Grünschnabel


Dabei seit: 25.11.2019
Beiträge: 2

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
21.04.2020 08:30 CombatWombat ist offline Beiträge von CombatWombat suchen Nehmen Sie CombatWombat in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Informatik in der Schule » Wo liegt der Fehler????