PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PQ Formel in Visual Basic.


Geldmann3
2012-02-26, 23:12:09
Hallo, ich wollte gerade mal testweise ein kleines Programm in Visual Basic 2010 schreiben, welches mir die Nullstellen eine quadratischen Gleichung mithilfe der PQ Formel errechnet.
Ich bin also mal ganz blauäugig hingegangen und habe meine Formel eingefügt.

Dim Positive As Integer
Dim Negative As Integer
Dim P As Integer
Dim Q As Integer
P = TextBox1.Text
Q = TextBox2.Text
Positive = -(P / 2) + (Math.Sqrt(P / 2) ^ 2 - Q)
Negative = -(P / 2) - (Math.Sqrt(P / 2) ^ 2 - Q)
MsgBox("Das Ergebnis ist x1=" & Positive & " x2=" & Negative)

Ich bekomme ein falsches Ergebnis angezeigt. Warum kommt VisualBasic mit meiner Formel nicht klar?
Ich weiß, ist sicher ein Anfängerfehler...

Trap
2012-02-26, 23:23:34
Exponentieren ist http://msdn.microsoft.com/en-us/library/system.math.pow.aspx , ^ ist binäres XOR.

Geldmann3
2012-02-26, 23:37:18
Was bedeutet "binäres XOR"?
2^3 oder 2^2 funktioniert einwandfrei...

Gast
2012-02-26, 23:47:47
Du hast eine Klammer falsch gesetzt. Hinter das Math.Sqrt, nicht davor.

Gast
2012-02-26, 23:50:06
Und nimm Double für die Variablen.

Geldmann3
2012-02-27, 00:10:33
Du hast eine Klammer falsch gesetzt. Hinter das Math.Sqrt, nicht davor.
Hatte ich erst so versucht, hat auch nicht funktioniert.

Und nimm Double für die Variablen.
Hast natürlich recht.

Monger
2012-02-27, 00:14:05
Exponentieren ist http://msdn.microsoft.com/en-us/library/system.math.pow.aspx , ^ ist binäres XOR.

Nö, "^" ist in VB.NET der überladene Operator für potenzieren:
http://msdn.microsoft.com/en-us/library/zh100ckf.aspx

XOR ist in VB.NET tatsächlich XOR.

Monger
2012-02-27, 00:21:51
@topic:

Das Ergebnis von "^" ist immer eine Zahl vom Typ Double. Da implizite Typkonvertierungen immer sich am größten Typus orientieren, ist das Ergebnis aus einer Integer und einer Double Zahl halt auch wieder ein Double.

Der Vollständigkeit halber: VB.NET kennt zwei Operatoren für Divisionen: "/" ist für Gleitkommaoperationen, "\" für Ganzzahl.

Das heißt, in folgender Formel sind alle Zahlen (und somit auch das Ergebnis) vom Typ Integer:


Dim Ergebnis as Integer = 24 \ 5 + 3


Ich vermute, in deinem Fall willst du ja eh keine natürliche Zahl, sondern eine gebrochen rationale Zahl als Ergebnis. Zumindest deine Endergebnisse (Positive und Negative) sollten dann also wahrscheinlich sinnvollerweise entweder vom Typ Double oder Decimal sein.

Geldmann3
2012-02-27, 00:32:10
Habe jetzt alles auf Double umgestellt. Funktioniert dennoch irgendwie nicht immer richtig. (Mir ist klar, dass es Gleichungen gibt, die nicht lösbar sind, die daher einen Fehler verursachen.)

Doch wenn ich nun p=6 und q=6 setze bekomme ich als Ausgabe.
Das Ergebnis ist x1= -6 x2= 4,44089209850063E-16
Das stimmt doch nicht....
Komischerweise funktioniert es manchmal mit anderen Werten doch.
Beispielsweise mit 4 und 3 - Dann bekomme ich -1 und -3 was stimmt.

Coda
2012-02-27, 00:37:58
Was müsste denn rauskommen?

Geldmann3
2012-02-27, 00:47:52
Laut WolframAlpha (http://www.wolframalpha.com/input/?i=x%C2%B2%2B6x%2B6%3D0) -1 komma irgendwas und minus 4 komma irgendwas

Gast
2012-02-27, 00:59:36
P=Q=6

bei "Positive = -(P / 2) +- (Math.Sqrt(P / 2) ^ 2 - Q)"

-6/2 + (Wurzel(6/2)^2 - 6) = -6
-6/2 - (Wurzel(6/2)^2 - 6) = 0

Du ziehst die Wurzel vom Argument und quadrierst das Ergebnis. Das was ausgespuckt wird ist richtig.

- ( P / 2 ) + Math.Sqrt( ( P / 2 ) ^ 2 - Q )

Geldmann3
2012-02-27, 01:15:53
Aha, ohne die Klammern nach der Wurzel, ziehe ich nicht die Wurzel aus dem Ganzen. Da hätte ich auch selbst drauf kommen können.
Danke! Jetzt Funktioniert es wie gedacht. :)

pest
2012-02-27, 11:16:09
Zur Feststellung der Form und Anzahl möglicher Lösungen wird die Diskriminante (http://de.wikipedia.org/wiki/Diskriminante) herangezogen