WinFuture-Forum.de: [gelöst] C# Wurzel aus Zahl x durch Annäherung berechnen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[gelöst] C# Wurzel aus Zahl x durch Annäherung berechnen funktioniert nicht mit Gleitkommazahlen


#1 _nobido_

  • Gruppe: Gäste

geschrieben 12. November 2010 - 20:03

Hiho Leute,

ich habe folgendes Problem: Ich habe ein Programm, das die Wurzel aus einer beliebigen positiven Zahl x durch Annäherung berechnen soll.

CODE
{
double ZahlE = -1; //Variable für Startzahl
double Teiler = 2; //
const double Toleranz = 0.000000000000001; //interne Genauigkeit
double ToleranzB = -1; //berechnete Toleranz
double Ergebnis = -1; //

ZahlE = Convert.ToDouble(Eingabe_txt.Text);
if (ZahlE >= 0)
{
if (ZahlE == 0 || ZahlE == 1)
{
Ausgabek_txt.Text = Convert.ToString(ZahlE);
}
else
{
do
{
Ergebnis = ZahlE / Teiler;
ToleranzB = Ergebnis - Teiler;
if (ToleranzB < 0)
{
ToleranzB = ToleranzB * (-1);
}
Teiler = (Ergebnis + Teiler) / 2;
} while (ToleranzB > Toleranz);
Ausgabek_txt.Text = Convert.ToString(Ergebnis);
}
}
else
{
Ausgabek_txt.Text = "Ungültige Eingabe!";
}
}



irgendwie bekomm ich das nicht formatiert rein hier...?

Leider funktioniert das irgendwie z.B. nicht mit x = 1.1, 1.5, 6.25 etc.

Hab hier noch den Quellcode als Textdatei und ein kleines Bild, was evtl. weiterhilft.

Angehängtes Bild: Wurzel_kanobeln.png Angehängte Datei  quelltext.txt (921bytes)
Anzahl der Downloads: 384


Bin leider nicht so der Mathefreak...
Kann mir wer sagen woran das liegt bzw. liegen könnte?


Danke schonmal im voraus...

greetz


Nachtrag: Habe gerade festgestellt das ich beim konvertieren mittels
ZahlE = Convert.ToDouble(Eingabe_txt.Text);
ZahelE = 625.0 erhalte. Versteh ich ja nun gar nicht. Woher also kommt dieser Verlust?

Dieser Beitrag wurde von nobido bearbeitet: 14. November 2010 - 13:29

0

Anzeige



#2 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.672
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 13. November 2010 - 15:48

 Zitat (nobido: 12.11.2010, 21:03)

Bin leider nicht so der Mathefreak...
Kann mir wer sagen woran das liegt bzw. liegen könnte?

Wohl an dem Verfahren, ein kluger Mathefreak hat das schon vor langer Zeit gelöst: http://de.wikipedia....Heron-Verfahren

Gruß
Spiderman
0

#3 _nobido_

  • Gruppe: Gäste

geschrieben 14. November 2010 - 09:51

Hiho,

Dank@Spiderman für die Antwort.

Aber das kann, soweit ich das beurteilen kann, nicht das Problem sein.
Habe mal eine Excel-Tabelle erstellt:
Angehängte Datei  Wurzel_aus_x.xlsx.txt (12,88K)
Anzahl der Downloads: 292 ( Dateiendung musste ich aendern, sonst kann ich die Datei nicht hochladen ) Mit 'meinem Verfahren' und dem von Heron.
Bis auf die Tatsache dass mal ich, mal der Heron ein oder zwei Berechnungen mehr benötigt sind die Ergebnisse recht identisch, auch beim Berechnen von Kommazahlen wie z.B. x=1.1, x= 6.25 etc.

Muss also an der Umsetzung im Quellcode liegen, weiss aber nicht wo da der Fehler ist.
Der C#-Code ist umgesetzt wie im PAP aufgemalt. Der Unterschied zur Excel-Tabelle sind halt die Variablen Toleranz und ToleranzB um die Genauigkeit des Ergebnis zu steuern.


joar...
nettes WE noch - wuensch ich mal


Weiterer Nachtrag: Gebe ich z.B. 6.25 ein erhalte ich bei der Konvertierung von Text zu Double 625.0 und als Ergebnis 25. Es wird also die Wurzel der falsch konvertierten Zahl berechnet.
Wieso aber erhalte ich diese Fehlerhafte Konvertierung?

Dieser Beitrag wurde von nobido bearbeitet: 14. November 2010 - 09:58

0

#4 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.672
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 14. November 2010 - 12:02

 Zitat (nobido: 14.11.2010, 10:51)

Weiterer Nachtrag: Gebe ich z.B. 6.25 ein erhalte ich bei der Konvertierung von Text zu Double 625.0 und als Ergebnis 25. Es wird also die Wurzel der falsch konvertierten Zahl berechnet.
Wieso aber erhalte ich diese Fehlerhafte Konvertierung?

Hast du es einmal mit einem Komma versucht, also "6,25" ?

Ich habe einmal eine Lösung mit Javascript geschrieben: http://mitglied.mult...111/index3.html

Die Quadratwurzel aus: 123.456
mit Startwert: X0 = 21
ist bei X1 = 13.439428571428572
ist bei X2 = 11.312766711412657
ist bei X3 = 11.112873494208607
ist bei X4 = 11.11107570094186
ist bei X5 = 11.111075555498669
der genaue Wert ist: 11.111075555498667
und der Fehler bei X5 beträgt 0.000000000000002

Gruß
Spiderman

Dieser Beitrag wurde von Spiderman bearbeitet: 14. November 2010 - 12:03

0

#5 _nobido_

  • Gruppe: Gäste

geschrieben 14. November 2010 - 13:23

 Zitat (Spiderman: 14.11.2010, 13:02)

Hast du es einmal mit einem Komma versucht, also "6,25" ?


lol && heul.
Das darf nicht wahr sein. Es wird das Komma in Form von "," in der Eingabe akzeptiert und das Komma in Form eines Punkt nicht. Aber... wieso?


 Zitat (Spiderman: 14.11.2010, 13:02)

Ich habe einmal eine Lösung mit Javascript geschrieben: http://mitglied.mult...111/index3.html


Sieht gut aus, auch wenn nur die grad am Thread beteiligten so wirklich wohl was damit anfangen können (was 'n Deutsch, ich weiss). Allerdings irritiert mich die Tatsache, dass deine Lösung per Javascript auch negative Zahlen berechnet (imaginäre Zahlen, oder? da war mal was... nur, WAS?).

Wobei mir die Berechnung aus Wurzel(-x) ja grundsätzlich suspekt ist.



Ansonsten: Dank für das Komma. Ich wär da, voraussichtlich bis morgen früh 9h, nicht selber drauf gekommen. Und auch nach 9h nicht :D - da allerdings hätt man mich dann drauf gestubst (hoff ich mal!, werd das mal gleich austesten, also morgen).

Danke nochmal.

greetz
0

#6 Mitglied ist offline   Spiderman 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.672
  • Beigetreten: 23. November 06
  • Reputation: 26

geschrieben 14. November 2010 - 14:45

 Zitat (nobido: 14.11.2010, 14:23)

Allerdings irritiert mich die Tatsache, dass deine Lösung per Javascript auch negative Zahlen berechnet (imaginäre Zahlen, oder? da war mal was... nur, WAS?).

Wobei mir die Berechnung aus Wurzel(-x) ja grundsätzlich suspekt ist.

Man kann eine negative Zahl eingeben, es rechnet aber immer mit positiven Zahlen:

Zitat

Eingabe: -100
Die Quadratwurzel aus: 100


Das macht die Math.abs() Funktion: Math.abs(document.getElementById("I1").value)

Besser wäre natürlich eine Eingabe Kontrolle mit Korrektur im Eingabefeld, aber das ist aufwendig.

Dein Programm verwendet die Zahlen-Formate nach den Ländereinstellungen, und da ist im deutschen der Punkt ein Tausender Trenner also 1.000 ist das gleiche wie 1000

Man kann auch das englische Zahlen-Format verwenden, da mußt du mal in der Hilfe oder Syntax suchen.

Gruß
Spiderman
0

#7 _nobido_

  • Gruppe: Gäste

geschrieben 14. November 2010 - 20:05

 Zitat (Spiderman: 14.11.2010, 15:45)

Besser wäre natürlich eine Eingabe Kontrolle mit Korrektur im Eingabefeld, aber das ist aufwendig.


Aufwendig in Java(script)? Sollte doch mit zwei bis drei Zeilen Programmcode erledigt sein zu prüfen ob die eingegebene Zahl positiv oder negativ ist.

 Zitat (Spiderman: 14.11.2010, 15:45)

Dein Programm verwendet die Zahlen-Formate nach den Ländereinstellungen, und da ist im deutschen der Punkt ein Tausender Trenner also 1.000 ist das gleiche wie 1000


Erklärt aber nicht, warum er aus z.B. 6.25 -> dann 625.0 macht. Da sollte noch nichts mit 1000'er-Trenner sein.

greetz

Nachtrag:
Die Fehlerhafte konvertierung von 6.25 zu 625 ist gar nicht so fehlerhaft. Der Punkt ist der Tausendertrenner und für des Programm/den Compiler bei Eingabe von 6.25 einfach nur an der falschen Stelle. Somit wird aus 6.25 korrekterweise 625.0 .

Dieser Beitrag wurde von nobido bearbeitet: 15. November 2010 - 11:39

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0