Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Wie kann ich bei diesem Code erreichen, das als Ergebnis hier 15 herauskommt?
Einfach einmal ein paar Worte zu diesem Code:
a) Die While Schleife wird entweder nie ausgeführt (result ist bereits 100) oder es wird eine Endlosschleife, denn Du veränderst result ja in der Schleife nicht. Daher ist die schleife so wie Du diese da geschrieben hast relativ sinnlos.
b) die if Abfrage nach der while Schleife ist unnötig. Denn nach der While Schleife muss result ja 100 sein, denn sonst wäre die Schleife ja nie verlassen worden.
Erster Punkt ist ein fataler Punkt und wäre aus meiner Sicht als Fehler zu werten. Zweiter Punkt ist von mir aus eine Frage der Schönheit....
result auf Deutsch Ergebnis. --> x = -2 --> result = 15
Du hast wahrscheinlich gemeint: Welcher Parameter erfüllt die Bedingung, dass es zur obigen Ausgabe kommt?
Aus Sicht des Benutzer ist es, dann aber etwas seltsam wenn man, nach der Eingabe von 15 als Feedback. "herzlichen Glückwunsch,das Ergebnis ist 15 !" bekommt.
Einfach einmal ein paar Worte zu diesem Code:
a) Die While Schleife wird entweder nie ausgeführt (result ist bereits 100) oder es wird eine Endlosschleife, denn Du veränderst result ja in der Schleife nicht. Daher ist die schleife so wie Du diese da geschrieben hast relativ sinnlos.
b) die if Abfrage nach der while Schleife ist unnötig. Denn nach der While Schleife muss result ja 100 sein, denn sonst wäre die Schleife ja nie verlassen worden.
Erster Punkt ist ein fataler Punkt und wäre aus meiner Sicht als Fehler zu werten. Zweiter Punkt ist von mir aus eine Frage der Schönheit....
Ich bin wirklich ein kompletter Neuling deshalb danke für die Erklärung! Meine Gedanken dabei waren, dass solange result nicht 100 ist, bei x 5 hinzugefügt werden. Irgendwann ist x dann 15, sodass result 100 ist. Dann, dachte ich zumindest, sollte ja die While Schleife ja unterbrochen werden und es müsste ausgegeben werden, dass x 15 ist. Wieso ist das nicht so?
@Stamp1t vielleicht verrätst du uns erstmal, was um alles in der Welt du denn überhaupt machen/erreichen willst.
Also: Was ist denn überhaupt das Ziel des ganzen?
Das Ziel ist ja anscheinend nicht, dass "am Ende" 15 "herauskommt" (das kann man ja wie gesagt auch sehr viel einfacher erreichen).
Du willst ja anscheinend irgendwas mit Schleifen machen. Was denn? Und warum?
Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden.
@Stamp1t vielleicht verrätst du uns erstmal, was um alles in der Welt du denn überhaupt machen/erreichen willst.
Also: Was ist denn überhaupt das Ziel des ganzen?
Das Ziel ist ja anscheinend nicht, dass "am Ende" 15 "herauskommt" (das kann man ja wie gesagt auch sehr viel einfacher erreichen).
Du willst ja anscheinend irgendwas mit Schleifen machen. Was denn? Und warum?
Ich wollte einfach ein bisschen rumprobieren und üben. Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden
Ich habe mir das so vorgestellt, dass man am Anfang, wie im Beispiel, 5 in Doit einfügt, dann wird die Rechnung durchgeführt und das Ergebnis ist ungleich 100, also wird zu x 5 zugefügt, dann wird wieder durchgerechnet, das Ergebnis ist immer noch nicht 100, also wird nochmal 5 zugefügt (Jetzt ist x 15) und result ist 100. Jetzt wird die schleife verlassen und es müsste x=15ausgegeben werden.
Danke! Das wars, was gefehlt hat.
Ich will mit diesem Program ja beliebige Gleichungen lösen. Wenn ich jetzt also auch Ergebnise mit Kommazahlen möchte, muss ich doch float oder double verwenden, oder? Das habe ich hier getan, und komischerweise kommt als Ergebnis 95.0 raus, obwohl es 47.5 sein müsste. Was muss ich änder? Danke schonmal
Danke! Das wars, was gefehlt hat.
Ich will mit diesem Program ja beliebige Gleichungen lösen. Wenn ich jetzt also auch Ergebnise mit Kommazahlen möchte, muss ich doch float oder double verwenden, oder? Das habe ich hier getan, und komischerweise kommt als Ergebnis 95.0 raus, obwohl es 47.5 sein müsste. Was muss ich änder? Danke schonmal
[CODE lang="java" title="."]package Methoden;
public class Program {
public static void main(String[] args) {
Doit(1);
}
public static void Doit(double number1) {
double x = number1;
double result = (10*x+25);
while(result!=500) {x++; result = (5*x+25);}
Ahh... jetzt kommen wir der Sache näher.
Dann willst du quasi numerische Nullstellensuche (z.B. Newton-Verfahren) implementieren.
(hint: das Lösen jeder Gleichung mit einer Unbekannten kann als das Finden der Nullstelle einer Funktion angesehen werden, indem man jeden Term auf der linken und rechten Seite des Gleichheitszeichens einfach auf dieselbe Seite bringt (und die andere Seite zu 0 werden lässt) und diese Seite als Funktionsterm ansieht. Jetzt kannst du dich ganz auf das Lösen von Nullstellen beschränken.)
Bei `500 = 5 * x + 25` etwa suchst du die Nullstelle der Funktion `f(x) = 5 * x + 25 - 500`
Ahh... jetzt kommen wir der Sache näher.
Dann willst du quasi numerische Nullstellensuche (z.B. Newton-Verfahren) implementieren.
(hint: das Lösen jeder Gleichung mit einer Unbekannten kann als das Finden der Nullstelle einer Funktion angesehen werden, indem man jeden Term auf der linken und rechten Seite des Gleichheitszeichens einfach auf dieselbe Seite bringt (und die andere Seite zu 0 werden lässt) und diese Seite als Funktionsterm ansieht. Jetzt kannst du dich ganz auf das Lösen von Nullstellen beschränken.)
Bei `500 = 5 * x + 25` etwa suchst du die Nullstelle der Funktion `f(x) = 5 * x + 25 - 500`
Stimmt, du hast recht.. Wie bringe ich das in den Code? Ist wahrscheinlich ziemlich einfach, aber ich habe gestern erst angefangen mit dem Coden. Danke schonmal
Ich denke erst einmal ist etwas "spielen" angesagt um die Grundlagen von Java zu verstehen....
Das erste wichtige ist jetzt, dass man double versteht und die Problematik, dass es bei der Umrechnung vom Dezimalsystem in das Dualsystem zu Ungenauigkeiten kommen kann.
Um das zu verstehen, können wir einfach einmal in der Schleife result ausgeben:
Java:
System.out.println("result: " + result);
Und dann bekommen wir eine Ausgabe - ich zeige diese einfach mal in den ersten Zeilen:
Das Problem ist, dass 0,1 im Dezimalsystem nicht so im Dualen System abgebildet werden kann. Statt 0,1 wird da dann ein Wert addiert, der etwas größer ist und dadurch kommt es dann zu der Ungenauigkeit.
Die Problematik verstärkt sich von Schritt zu Schritt, weil immer statt 0,1 ein kleines bisschen mehr addiert wird,
Eine Lösung dabei wäre es, wenn wir dann im Anschluss immer runden. Man könnte z.B. bei Dir auf eine Stelle hinter dem Komma runden und so die Ungenauigkeit immer wieder weiter reduzieren. https://wiki.byte-welt.net/wiki/Fließkommazahlen_mit_Java_runden zeigt da diverse Möglichkeiten.
Nehmen wir von der Seite:
Java:
/**
* Rundet den übergebenen Wert auf die Anzahl der übergebenen Nachkommastellen
*
* @param value ist der zu rundende Wert.
* @param decimalPoints ist die Anzahl der Nachkommastellen, auf die gerundet werden soll.
*/
private double round(double value, int decimalPoints) {
double d = Math.pow(10, decimalPoints);
return Math.round(value * d) / d;
}
(Die Methode machen wir noch static, denn wir wollen ja keine Instanz erzeugen.)
Das könnten wir nun mit aufnehmen und x immer auf 1 Nachkommastelle runden:
Java:
public static void Doit(double number1) {
double x = number1;
double result = (10 * x);
while (result != 501) {
x = round(x + 0.1,1);
result = (10 * x);
System.out.println("result: " + result);
}
if (result == 501) {
System.out.println("herzlichen Glückwunsch,das Ergebnis ist" + " " + x + "!");
}
}
Das wäre dann jetzt ein korrekterer Umgang mit double.
Ach ja - Duale Zahlen könnte man sich ja einmal ansehen um zu sehen, was für werte man da hat:
0.1 ==> 0,5 (2^-1)
0.01 ==> 0,25 (2^-2)
0.001 ==> 0,125 (2^-3)
0.0001 ==> 0.0625 (2^-4)
0.00001 ==> 0,03125 (2^-5)
...
Die interne Darstellung selbst ist noch etwas komplexer, aber mir geht es erst einmal um die reine Verständnisfrage. Die interne Darstellung unterteilt es in eine Form x * 2 ^ y und dabei wird y so gewählt, dass x mit einer 1,.... anfängt, so dass dieses erste Bit nicht gespeichert werden muss ... Aber man erkennt durch diese Aufstellung, dass man bei der Dezimal 0,1 keine einfache Duale Darstellung hat...
Mal off-topic: Wäre es möglich, hier im Forum dem code-Tag einen Java-Autoformatter zu spendieren? Den meist völlig unformatierten Code mit den zehn Millionen unnötigen Leerzeilen zu lesen, ist manchmal wirklich anstrengend. Schreiben Leute wirklich so ihren Code?
"Hmmm... so, jetzt schreibe ich diese Zeile vom Code zuende und danach setze ich einfach erstmal acht Leerzeilen. Ja, so mache ich das."
Ach ja - Duale Zahlen könnte man sich ja einmal ansehen um zu sehen, was für werte man da hat:
0.1 ==> 0,5 (2^-1)
0.01 ==> 0,25 (2^-2)
0.001 ==> 0,125 (2^-3)
0.0001 ==> 0.0625 (2^-4)
0.00001 ==> 0,03125 (2^-5)
...
Die interne Darstellung selbst ist noch etwas komplexer, aber mir geht es erst einmal um die reine Verständnisfrage. Die interne Darstellung unterteilt es in eine Form x * 2 ^ y und dabei wird y so gewählt, dass x mit einer 1,.... anfängt, so dass dieses erste Bit nicht gespeichert werden muss ... Aber man erkennt durch diese Aufstellung, dass man bei der Dezimal 0,1 keine einfache Duale Darstellung hat...
Vielen Dank für Ihre ausführliche Antwort und für die Zeit, die Sie sich für mich nehmen Ich werde mir das alles nochmal genau anschauen, da ich mit meinem WIssensstand hier noch nicht so viele verstehe.