Probleme bei Berechnung von PQ Formel

Go-Autoit

Grünschnabel
Hallo Forum,

ich habe ein Problem bei der Berechnung folgender Formel (Anhang).
pq.jpg

Bei diesem kleinen Programm soll der Wert für P und Q vom User eingegeben werden.
Für P soll -5 eingegeben werden und für Q 3.

Also
P = -5
Q = 3

Leider komme ich mit meiner Berechnung nicht auf die "Musterlösung".

Musterlösung
x1 = 4.30
x2 = 0.70


Habe ich einen Fehler innerhalb meiner Berechnung, oder nutze ich den Befehl Sqrt flasch?

Ich würde mich über eure Hilfe sehr freuen.
Danke.

Hier Mein Code:
Code:
#include <stdio.h>
#include <math.h>

int main()
{
	int p, q;
	double x1, x2;
							
	double s;				//Zwischenvar für qurzel
	double wurzel;			//Var für Sqrt
	double sqrt(double wurzel);
	//double sqrt(double);

	printf("Bitte geben Sie P ein : ");

	scanf("%d",&p); 

	printf("Bitte geben Sie Q ein : ");

	scanf("%d",&q); 


	//Rechnung
	
	s = ( -p ^ 2 / 4 )  - q;

	wurzel = sqrt(s);
	


	x1 = -0.5 * p + wurzel;
	
	x2  = -0.5 * p - wurzel;
	



	//ausgabe

	printf("x1 = %.2f \n ", x1);
	printf("x2 = %.2f", x2);

	//x^2 + p + x + q = 0

	return 0;

}
 
Zuletzt bearbeitet:
Hi

vllt. gibts noch Fehler, aber einen hätt ich schon:
C++:
s = ( -p ^ 2 / 4 )  - q;
^ ist nicht das math. Potenzieren. (Außerdem gehört das - bei -p weg)
Weils nur Quadrat ist:
C++:
s = ( p * p / 4 )  - q;
Für höhere Potenzen kann man pow nehmen.

Gruß
 
Super Danke :).
Das hätte ich nicht so schnell entdeckt.

Nun komme ich auf folgende Werte.
X1= 4.23
X2 = 0.77

Leider unterscheidt sich meine Lösung mit der Musterlösung.
Musterlösung
x1 = 4.30
x2 = 0.70

Kann es sein, dass ich noch einen Fehler im Code habe, oder etwas nicht beachtet hab?

Grüße
 
Hab den Code mal etwas aufgeräumt und Casts eingefügt, geht:
C++:
#include <stdio.h>
#include <math.h>

int main()
{
	int p, q;
	double a, b;

	printf("Bitte geben Sie P ein : ");
	scanf("%d", &p); 
	printf("Bitte geben Sie Q ein : ");
	scanf("%d", &q); 

	//Rechnung

	a = -0.5 * (double)p;

	b = sqrt(((double)p * (double)p / 4.0 ) - (double)q);

	//ausgabe

	printf("x1 = %.2f\n ", a + b);
	printf("x2 = %.2f\n", a - b);

	return 0;
}

Gruß
 
Ich danke dir :).

Kannst du mir erklären was dies bewrikt?

a = -0.5 * >>> (double)p <<<<;

Hätte man nicht einfach p schreiben können?
 
Wenn man Kommatypen mit Nichtkommatypen verrechnet ist nicht immer ganz eindeutig,
was der Compiler macht. (In dem Fall eigentlich schon, aber um sicher zu gehen...)

Der Normalfall wäre (ohne (double)): Es wird intern aus p ein double gemacht
und dann dieses double mit dem double -0.5 multipliziert.
Das Extrembeispiel, wie es nicht sein sollte:
Weil p ja ein int ist, wird aus -0.5 ein int gemacht (=0) und dann 0 mit p multipliziert.

Die Zeile hätte ziemlich sicher ohne (double) auch funktioniert,
aber so kann man dem Compiler jedenfalls sagen, was wohin umzuformen ist.
Besser mehr casten als zu wenig.

Das Problem vorher war wahrscheinlich das
p * p / 4
in der Wurzel.
Das sind alles int, also war das Ergebnis auch ein int.
Das bei der Division eventuell Kommastellen anfallen, ist dem Computer egal.
Deshalb einfach alle drei Teile in double umformen:
(double)p * (double)p / 4.0

Gruß
 
Hi.
Kannst du mir erklären was dies bewrikt?

a = -0.5 * >>> (double)p <<<<;
Das nennt man Cast und es bewirkt, das der Wert der int-Variablen p in einen double Wert "umgewandelt" wird.
Hätte man nicht einfach p schreiben können?
Ja, hätte man. Aber nur weil der andere Operand (das Literal -0.5) ein double ist und somit die automatische Typ-Beförderung (von int zu double) durchgeführt wird.

\edit: zu langsam....

Gruß
 
Ich danke dir. Hatte grade im Handbuch nachgeschlagen und nun erklärt sich auch mit deinem Post die Datenypumwandlung.

Danke dir.

Thread kann geschlossen werden.
Problem gelöst.

Problemlösung:
Keine Datentypumwandlung und Computer hat mit falschen Zahlen gerechnet.
Weitere Infos
 
Schließen bzw. als "Erledigt" markieren kannst du selber (und außer Moderatoren nur du):
Ein Klick auf den blau-weißen Haken unten neben "Auf Thema Antworten"
oder das "Nein" bei Erledigt oben.
 
Zurück