Zum Inhalt springen

[C] Möglicher Fehler bei der Umsetzung der Mitternachts-Formel???


Empfohlene Beiträge

Geschrieben

Hallo! Wie der Titel schon wissen lässt, hab ich offensichtlich ein Fehler bei der Umsetzung der Formel in C.

Und zwar, wenn ich die Glieder a, b, c (1, -2, 1) in meinem Programm eintippe kommen die Werte 2 und 2 Raus? Dabei musste -1 und -1 Rauskommen:

x² - 2x + 1 = 0 | -1

x² - 2x = -1 | quadrat. Ergänzung

(x + 1)² = 0 | Wurzel

x = -1

Hier der Quelltext (siehe rotmarkierte Stelle):


#include <stdio.h>

#include <math.h>


int main(void)

{

float a, b, c, out[1], D;

int i = 1;


do

{


printf("x%d: ", i++);

scanf("%f %f %f", &a, &b, &c);

printf("\n");


[COLOR="Red"]D = pow(b,2)-4*a*c;


out[0] = -b-sqrt(D)/2*a;

out[1] = -b+sqrt(D)/2*a;

[/COLOR]

printf("%f\n%f\n\n", out[0], out[1]);


}

while(getchar() != 'c');


return 0;

}

Geschrieben (bearbeitet)

x² - 2x + 1 = 0 | -1

x² - 2x = -1 | quadrat. Ergänzung

(x + 1)² = 0 | Wurzel

x = -1

Fehler endeckt und korigiert!

x² - 2x + 1 = 0 | -1

x² - 2x = -1 | quadrat. Ergänzung

(x - 1)² = 0 | Wurzel

x = +1

Man oh man ich bin sowas von Unkonzentriert!

So nun zum Fehler im Programm:

@Klotzkopp

Egal wie viel klammern ich einbau ich bekomme das ergebnis 2 und 2 statt 1 und 1, Warum?

out[0] = ((--(sqrt(D))/(2*a));

out[1] = ((-+(sqrt(D))/(2*a));[/code]




Übrigens hier auch:



[code]D = ((pow(b,2))-(4*a*c));

Bearbeitet von squidward
Geschrieben
Egal wie viel klammern ich einbau ich bekomme das ergebnis 2 und 2 statt 1 und 1, Warum?

Ein Bruchstrich bedeutet implizit eine Klammer um Zähler und Nenner. Den Nenner hast du zwar geklammert, den Zähler aber nicht (dafür aber den Gesamtausdruck).

Ach ja, es wäre auch schön, wenn du dem Array out auch ein zweites Element gönnst, wenn du schon drauf zugreifst.

Geschrieben (bearbeitet)
Ein Bruchstrich bedeutet implizit eine Klammer um Zähler und Nenner. Den Nenner hast du zwar geklammert, den Zähler aber nicht (dafür aber den Gesamtausdruck).

Juhuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu, es klappt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Danke!

Ach ja, es wäre auch schön, wenn du dem Array out auch ein zweites Element gönnst, wenn du schon drauf zugreifst.

Wie meinst du das? Welches Element?

Achso meinst du z.B. bei int i? Aber darf ich überhaupt da das out benutzen das ja bei double liegt?

Bearbeitet von squidward
Geschrieben

Moin.

Wie meinst du das? Welches Element?

Diese hier?


[...]

float a, b, c, out[[COLOR="Red"][B]1[/B][/COLOR]], D;

[...]

out[[B][COLOR="#ff0000"]0[/COLOR][/B]] = -b-sqrt(D)/2*a;

out[[B][COLOR="#ff0000"]1[/COLOR][/B]] = -b+sqrt(D)/2*a;

[...]

Geschrieben

Hi,

Aber das macht das ganze ja noch unübersichtlicher welchen vorteil bringt mir denn das?


#include <stdio.h>

#include <math.h>


int main(void)

{

float out[5];

int i = 1;


do

{


printf("x%d: ", i++);

scanf("%f %f %f", &out[0], &out[1], &out[2]);

printf("\n");


out[3] = pow(out[1],2)-4*out[0]*out[2];


out[4] = (-b-sqrt(D))/2*out[0];

out[5] = (-b+sqrt(D))/2*out[0];


printf("%f\n%f\n\n", out[4], out[5]);


}

while(getchar() != 'c');


return 0;

}

Aber na ja hauptsache es funktioniert jetzt!

Vielen Dank!

Geschrieben

Das meinte ich nicht.

Wenn du auf out[0] und out[1] zugreifst, musst du out auch als Array mit 2 Elementen deklarieren. Du hast es (in der ursprünglichen Version) als Array mit einem einzigen Element deklariert.

Und auch in deiner neuen Version ist out um 1 zu klein.

Geschrieben

He's dead, Jim! :beagolisc

Aber na ja hauptsache es funktioniert jetzt!

Wenn es denn auch würde...


[...]

float out[[B][COLOR="Red"]5[/COLOR][/B]];

[...]

out[4] = (-b-sqrt(D))/2*out[0];

out[[B][COLOR="#ff0000"]5[/COLOR][/B]] = (-b+sqrt(D))/2*out[0];

Geschrieben
Das meinte ich nicht.

Wenn du auf out[0] und out[1] zugreifst, musst du out auch als Array mit 2 Elementen deklarieren. Du hast es (in der ursprünglichen Version) als Array mit einem einzigen Element deklariert.

Und auch in deiner neuen Version ist out um 1 zu klein.

Fängt das Zählen bei C nicht bei 0 an?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...