# Quadratische Gleichung



## vinkulja6 (25. Sep 2009)

Hab da ein kleines problem mit einer quadratischen gleichung und irgendwie komm ich da nicht weiter.

Bekomme als Ausgabe immer ein NaN, könnt ihr mir vielleicht helfen den fehler zu finden?


```
class SolveQuadratic
{
	public static void main(String[] args)
	{
		double a, b, c;
		double x1, x2;
		
		a = Double.parseDouble(args[0]);
		b = Double.parseDouble(args[1]);
		c = Double.parseDouble(args[2]);
		
		x1 = (- b + (Math.sqrt(Math.pow(b,2) - (4 * a * c)))) / (2 * a);
		x2 = (- b - (Math.sqrt(Math.pow(b,2) - (4 * a * c)))) / (2 * a);
		
		System.out.println(x1);
		System.out.println(x2);
	}
}
```


----------



## SlaterB (25. Sep 2009)

bitte in doppelter Hinsicht extrem doll merken:

wenn man an der Logik eines einfachen Programms feilt, NIE Eingaben vom Benutzer einlesen oder hier per Programm-Parameter,
1. muss man das unnötig jedes Mal eintippen
2. verliert das Programm und deine Problembeschreibungen hier im Forum stark an Aussagekraft, da unbekannt ist, welche Eingaben du verwendest,

programmiere 

```
double a = 4;
        double b = 5;
        double c = 6;
```
oder was auch immer, dann ist das Thema abgehakt,

mit dem Beispiel kommen bei mir auch NaN, aber das muss ja erstmal nix heißen, suche ein Beispiel, welches auf dem Papier funktioniert


----------



## Landei (25. Sep 2009)

Die Gleichung muss auch lösbar sein. x²+1 = 0 ist etwa im Reellen nicht lösbar, weil du dann die Wurzel aus einer negativen Zahl ziehen müsstest (was ja letztendlich zu den imaginären und komplexen Zahlen geführt hat).
Ich würde Math.pow(b,2) unbedingt durch b*b ersetzen und vor dem Wurzelziehen prüfen, ob b² - 4ac auch nichtnegativ ist und andernfalls mit einer entsprechenden Meldung abbrechen.


----------



## Leroy42 (25. Sep 2009)

vinkulja6 hat gesagt.:


> Bekomme als Ausgabe immer ein NaN, könnt ihr mir vielleicht helfen den fehler zu finden?


Und in welcher Zeile wird der Fehler ausgegeben?


----------



## SlaterB (25. Sep 2009)

15 + 16


----------



## vinkulja6 (25. Sep 2009)

SlaterB hat gesagt.:


> bitte in doppelter Hinsicht extrem doll merken:
> 
> wenn man an der Logik eines einfachen Programms feilt, NIE Eingaben vom Benutzer einlesen oder hier per Programm-Parameter,
> 1. muss man das unnötig jedes Mal eintippen
> ...



die aufgabenstellung ist eben das die zahlen in der komandozeile eingelesen werden



Landei hat gesagt.:


> Die Gleichung muss auch lösbar sein. x²+1 = 0 ist etwa im Reellen nicht lösbar, weil du dann die Wurzel aus einer negativen Zahl ziehen müsstest (was ja letztendlich zu den imaginären und komplexen Zahlen geführt hat).
> Ich würde Math.pow(b,2) unbedingt durch b*b ersetzen und vor dem Wurzelziehen prüfen, ob b² - 4ac auch nichtnegativ ist und andernfalls mit einer entsprechenden Meldung abbrechen.



danke dir, funkt jetzt


----------



## SlaterB (25. Sep 2009)

vinkulja6 hat gesagt.:


> die aufgabenstellung ist eben das die zahlen in der komandozeile eingelesen werden


aber die Aufgabenstellung zwingt dich doch nicht, dich selber in der Entwickung zu hemmen, noch das Forum zu ärgern,
erst mit Testdaten arbeiten, später, wenn alles läuft dann die Eingabe

(ist jetzt grundsätzlich gemeint, hat ja anscheinend schon geklappt)


----------



## vinkulja6 (25. Sep 2009)

SlaterB hat gesagt.:


> aber die Aufgabenstellung zwingt dich doch nicht, dich selber in der Entwickung zu hemmen, noch das Forum zu ärgern,
> erst mit Testdaten arbeiten, später, wenn alles läuft dann die Eingabe
> 
> (ist jetzt grundsätzlich gemeint, hat ja anscheinend schon geklappt)



sorry das ich dich geärgert habe bzw das forum. 

lag an dem math.pow was ich mir eigentlich nicht wirklich erklären kann wieso, weil ich als erstes ohne das math.pow gearbeitet habe.

is ja nun egal, das programm funzt und ich bin happy  danke an alle die mir geholfen haben


----------



## Marco13 (25. Sep 2009)

vinkulja6 hat gesagt.:


> die aufgabenstellung ist eben das die zahlen in der komandozeile eingelesen werden



Dazu ein Tipp:

```
class Bla
{
    public static void main(String args)
    {
        // Test:
        computeAndPrintResults(4,5,6);

        // Kein Test:
        //doit();
    }

    public static void doit()
    {
        // a,b,c vom user eingeben lassen, dann
        computeAndPrintResults(a,b,c);
    }

    private static void computeAndPrintResults(double a, double b, double c)
    {
        // Rechnen, Ergebnis ausgeben
    }
}
```

Berechnung und Ausgabe vermischen ist zwar an sich auch nicht schön, aber immerhin besser als Berechnung, Ausgabe UND Eingabe zu vermischen


----------



## Landei (25. Sep 2009)

vinkulja6 hat gesagt.:


> lag an dem math.pow was ich mir eigentlich nicht wirklich erklären kann wieso, weil ich als erstes ohne das math.pow gearbeitet habe.



Math.pow arbeitet mit reellen Zahlen. Eine negative Basis ergibt dann wenig Sinn, denn auch wenn (-2)^2 ganz klar 4 ist, ist z.B. (-2)^2.000000000001 schon eine komplexe Zahl. Noch deutlicher wird das bei Wurzeln: (-8)^(1/3) ist -2, aber (-8)^0.3333333333333333 eine komplexe Zahl. Aus diesem Grund verweigert Math.pow bei jeglicher negativen Basis seine Arbeit. Für Quadrate, Kuben und Biquadrate sollte man sowieso lieber "per Hand" multiplizieren, und bei Wurzeln zweiten und vierten Grades lieber Math.sqrt anstatt Math.pow nehmen.


----------



## SlaterB (25. Sep 2009)

> Aus diesem Grund verweigert Math.pow bei jeglicher negativen Basis seine Arbeit. 

aber doch nur bei krummen Exponenten?


```
public class Test
{
    public static void main(String[] args)
    {
        System.out.println(Math.pow(-2, 2));
        System.out.println(Math.pow(-2, 2.01));
    }
}
```
->

```
4.0
NaN
```

in diesem Programm mit expliziter Angabe von Exponent 2 scheint mir Math.pow keine Rolle gespielt zu haben


----------



## Landei (25. Sep 2009)

Uups, da lag ich falsch. Ich habe mir wohl die Javadoc nicht genau genug durchgelesen:

```
Returns the value of the first argument raised to the power of the second argument. Special cases:

    * If the second argument is positive or negative zero, then the result is 1.0.
    * If the second argument is 1.0, then the result is the same as the first argument.
    * If the second argument is NaN, then the result is NaN.
    * If the first argument is NaN and the second argument is nonzero, then the result is NaN.
    * If
          o the absolute value of the first argument is greater than 1 and the second argument is positive infinity, or
          o the absolute value of the first argument is less than 1 and the second argument is negative infinity, 
      then the result is positive infinity.
    * If
          o the absolute value of the first argument is greater than 1 and the second argument is negative infinity, or
          o the absolute value of the first argument is less than 1 and the second argument is positive infinity, 
      then the result is positive zero.
    * If the absolute value of the first argument equals 1 and the second argument is infinite, then the result is NaN.
    * If
          o the first argument is positive zero and the second argument is greater than zero, or
          o the first argument is positive infinity and the second argument is less than zero, 
      then the result is positive zero.
    * If
          o the first argument is positive zero and the second argument is less than zero, or
          o the first argument is positive infinity and the second argument is greater than zero, 
      then the result is positive infinity.
    * If
          o the first argument is negative zero and the second argument is greater than zero but not a finite odd integer, or
          o the first argument is negative infinity and the second argument is less than zero but not a finite odd integer, 
      then the result is positive zero.
    * If
          o the first argument is negative zero and the second argument is a positive finite odd integer, or
          o the first argument is negative infinity and the second argument is a negative finite odd integer, 
      then the result is negative zero.
    * If
          o the first argument is negative zero and the second argument is less than zero but not a finite odd integer, or
          o the first argument is negative infinity and the second argument is greater than zero but not a finite odd integer, 
      then the result is positive infinity.
    * If
          o the first argument is negative zero and the second argument is a negative finite odd integer, or
          o the first argument is negative infinity and the second argument is a positive finite odd integer, 
      then the result is negative infinity.
    * If the first argument is finite and less than zero
          o if the second argument is a finite even integer, the result is equal to the result of raising the absolute value of the first argument to the power of the second argument
          o if the second argument is a finite odd integer, the result is equal to the negative of the result of raising the absolute value of the first argument to the power of the second argument
          o if the second argument is finite and not an integer, then the result is NaN. 
    * If both arguments are integers, then the result is exactly equal to the mathematical result of raising the first argument to the power of the second argument if that result can in fact be represented exactly as a double value.
```


----------



## Gast (6. Nov 2009)

hey leute, bin erstmal als gast hier =) mal schauen wie es mir gefällt, habe gleich mal ein problem, soll fürs studium eine übung machen und zwar ein quadratische gleichung lösen. ich bin soweit gekommen, aber bei der diskriminante komm ich einfach nicht weiter.... würde mich über eine schnelle antwort freuen... mfg KriSiuN 
mein programm schaut so aus:

/* QuadGleichung.java */

public class QuadGleichung
{
	public static void main(String[] args)
	{
		int a, b, c;
		a = 1;
		b = 8;										// ax^2 * bx * c = 0
		c = 10;

		if (a == 0)
		{
			if (b == 0)
			{
				if (c == 0)
				{
					System.out.println("unendliche möglichkeiten");
				}
				else
				{
					System.out.println("keine lösung");
				}
			}
			else 
			{
				System.out.println("eine Lösung x = " + (-c / b));
			}
		}
		else
		{
			float d = F;
			System.out.println("Diskriminante" + ((b*b)  (-4 * a * c)));
		}
	}
}


----------



## Leroy42 (6. Nov 2009)

Wie kommst du auf die merkwürdigen Fallunterscheidungen? ???:L


----------



## Gast (6. Nov 2009)

hat unser prof. so gesagt ^^ wir haben halt noch nicht viele befehle ^^programmier erst seit anfang oktober ^^also weiß nicht, kannst du mir irgendwie weiter helfen? wäre super ... komm einfach nicht weiter  wollte es halt so machen, wiel ich kanns ja aufteilen eine quad. gleichung, mein gedankengang war halt wenn a b und c gleich 0 sind dann ists ja 0, wenn a 0 ist dann hab ich nur eine lineare gleichung... und so weiter.. und am ende will ich die diskriminante mit fallunterscheidung, also wenn D > 0 dann hab ich ja 2 x stellen ... bei D = 0 hab ich ja eine stelle mit x1,x2 und D < 0 hab ich ja keine nullstelle .... so war halt mein gedankengang, vllt hast du ne idee wie ich es anders schreiben kann aber würde es halt gerne verstehen nicht nur hinschreiben  

vielen dank für deine mühe


----------



## SlaterB (6. Nov 2009)

was ist denn die Frage?
generell an eines der drei Dinge denken:
1. Compilerfehler?
2. Exception zur Laufzeit?
3. falsche Ausgabe?
oder geht gar nix und du suchst nach Ideen?

----

((b*b) [1] (-4 * a * c))

an der Stelle [1] muss irgendwas stehen


----------



## Leroy42 (6. Nov 2009)

Ich würde es so lösen:


```
public class QuadGleichung {
  public static void main(String[] args) {
    double a = 1;
    double b = 8;
    double c = 10;
    double d = b*b-4*a*c:
    if (d < 0) {
      System.out.println("Keine Lösung");
    }
    else {
      System.out.println("x1=" + ((-b+Math.sqrt(d) / (2*a)));
      System.out.println("x2=" + ((-b-Math.sqrt(d) / (2*a)));
    }
}
```


----------



## Marco13 (6. Nov 2009)

Das mit den Fallunterscheidungen ist schon OK. Und wie der letzte Fall behandelt wird, steht ja schon fast in diesem Thread. Schreib' doch mal die Formel als Quellcode hin ...
double x1 = ...
double x2 = ...


----------



## Gast (6. Nov 2009)

boah ihr überfordert mich, bin noch voll der noob im programmieren oO krieg des nicht hin... die befehle die ihr mir reinschreibt sind bestimmt gut, aber ich kenn diese noch nicht  keine ahnung wie ich des lösen soll ^^


----------



## Gast (6. Nov 2009)

Leroy42 hat gesagt.:


> Ich würde es so lösen:
> 
> 
> ```
> ...




also ich checks eigentl. schon was du hier machst, aber wieso double? und wieso ein d?? das wenn d <0 ist keine lösung versteh ich auch noch... aber die formel mit x1 = ..... check ich nicht ganz, kann mri das bitte jemand erklären?


----------



## icarus2 (6. Nov 2009)

Das nennt man die allgemeine Lösungsformel einer quadratischen Gleichung.

Wenn du a*x^2 + b*x + c = 0 auflöst, dann erhältst du die beiden Formeln. Wichtig wäre noch, dass die Lösungsformel nur gilt, wenn a != 0 ist.

*Edit:
Ich hab keine Lust die ganze Theorie hier einzutippen, aber vielleicht hilft dir das ein bisschen:
Quadratische Gleichung - Lösungsformel

*Edit 2:
Die Variable d steht für die Diskriminante D. Die Diskriminante besteht aus dem Teil, der sich in der Löungsformel in der Wurzel befindet.


----------

