# C# Heron Verfahren



## TotalerAnfängerin (12. Nov 2017)

Hallo,

ich habe versucht ein Programm zum Heron-Verfahren zu schreiben, bekomme aber leider kein Ergebnis bzw. 0 raus. Und ich finde auch den Fehler nicht. Wäre super, wenn mir jemand etwas weiterhelfen könnte, wo genau mein Fehler liegt und/oder wie ich es besser schreiben könnte.

Die Wurzel soll für die Zahlen zwischen 10 und 100 berechnet werden (in 10er-Schritten, also 10, 20, 30 usw.) und es darf nicht Math.sqrt verwendet werden.
Dir for-Schleife für die Ausgabe habe ich in die Main-Methode eingebaut, die Berechnung für Heron ist eine eigene Funktion.


```
double d = 0;                 // d ist der Wert für q
            double firstResult;           // Wert für das Ergebnis der ersten Iteration
            double secondResult;          // Ergebniswert für alle folgenden Iterationen

            firstResult = 1 / 2 + (1 + d / 1);
            secondResult = 1 / 2 * (firstResult + (d / firstResult));
            return secondResult;
```

Dankeschön im Voraus.


----------



## Dompteur (12. Nov 2017)

Das Ergebnis der Division von 2 ganzzahligen Werten ist wiederum ein ganzzahliger Wert. Du erwartest aber wahrscheinlich ein Ergebnis von Typ double.
Also 1 / 2 ergibt 0 !
Du kannst einfach bei jeder ganzen Zahl ein ".0" anhängen.


----------



## krgewb (12. Nov 2017)

d / 1 ist wiederum d.


----------



## TotalerAnfängerin (12. Nov 2017)

Dompteur hat gesagt.:


> Das Ergebnis der Division von 2 ganzzahligen Werten ist wiederum ein ganzzahliger Wert. Du erwartest aber wahrscheinlich ein Ergebnis von Typ double.
> Also 1 / 2 ergibt 0 !
> Du kannst einfach bei jeder ganzen Zahl ein ".0" anhängen.



Stimmt natürlich, danke. 
Allerdings bekomme ich trotzdem nicht das richtige Ergebnis raus. Mein Programm gibt mir dasselbe Ergebnis für alle Zahlen aus und zwar 1,45 - das stimmt vor und hinten nicht.


----------



## TotalerAnfängerin (12. Nov 2017)

krgewb hat gesagt.:


> d / 1 ist wiederum d.


Schon, aber selbst wenn ich es in nur d ändere, gibt es mir den falschen Wert raus :/


----------



## Dompteur (12. Nov 2017)

Ich habe das jetzt mit 2 weiteren Iterationen selbst ausprobiert.


```
using System;

public class Test
{
    public static void Main()
    {
        double d = 0;                 // d ist der Wert für q
        double firstResult;           // Wert für das Ergebnis der ersten Iteration
        double secondResult;          // Ergebniswert für alle folgenden Iterationen

        firstResult = 1.0 / 2.0 + (1.0 + d / 1.0);
        Console.WriteLine(firstResult);
        secondResult = 1.0 / 2.0 * (firstResult + (d / firstResult));
        Console.WriteLine(secondResult);
        double thirdResult = 1.0 / 2.0 * (secondResult + (d / secondResult));
        Console.WriteLine(thirdResult);
        double forthResult = 1.0 / 2.0 * (thirdResult + (d / thirdResult));
        Console.WriteLine(forthResult);
    }
}
```

Das liefert mir folgende Ausgabe:

```
1.5
0.75
0.375
0.1875
```

Du kannst das online hier nachvollziehen: https://ideone.com/g8lyfm


----------



## TotalerAnfängerin (12. Nov 2017)

Dompteur hat gesagt.:


> Ich habe das jetzt mit 2 weiteren Iterationen selbst ausprobiert.
> 
> 
> ```
> ...



Also ich zeige jetzt mal die for-Schleife und die Ausgabe.
Irgendwo habe ich einen herben Fehler. Zudem ist mir bereits der erste Fehler aufgefallen: bei firstResult sollte es 
"0.5 *** (1.0 + (d/1.0))" lauten.

```
Console.WriteLine("Wurzelberechnung mit dem Heronverfahren:");
            for (double d = 0; d <= 100; d += 10)
            {
                Console.WriteLine($"{d,4}  | {WurzelHeron(d),8:F5} | {Math.Sqrt(d),8:F5} |  {Math.Sqrt(d),8:F5}");
            }
```


----------



## Dompteur (12. Nov 2017)

Zeig doch bitte einmal den vollständigen Code der Methode "WurzelHeron".


----------



## TotalerAnfängerin (13. Nov 2017)

-


----------



## TotalerAnfängerin (13. Nov 2017)

-


----------



## TotalerAnfängerin (13. Nov 2017)

Dompteur hat gesagt.:


> Zeig doch bitte einmal den vollständigen Code der Methode "WurzelHeron".



Das war schon der ganze Code... Jetzt schäme ich mich 
Ich hatte mir noch überlegt eine Schleife in die Funktion einzubauen, weiß aber nicht ob das überhaupt was bringen würde.


----------



## Dompteur (13. Nov 2017)

TotalerAnfängerin hat gesagt.:


> Das war schon der ganze Code...


Du hast im Eingangsbeitrag deine Heron-Implementierung gezeigt.
Da haben wir festgestellt, dass es auf jeden Fall Probleme mit den Integer-Zahlen gibt. Ich nehme an, dass du da etwas an deinem Code verändert hast.
Vielleicht ist bei dieser Veränderung etwas schief gegangen.
Außerdem ist dein erstes Code-Stück nur ein Ausschnitt einer Methode. Ich vermute, dass die vollständige Methode nicht viel länger ist. Also poste einfach die Methode in der aktuellen Fassung noch einmal.

Hast du meinen Code ausprobiert ? Wenn ich den ausführe, dann sehe ich, dass sich der Wert mit jeder Iteration dem erwarteten Ergebnis nähert.


----------



## JavaUndC-Prog (27. Dez 2017)

Hi in Java sieht das c.a so aus:


```
public class Heron {
    static double heron_methode(double x){
        // Eingabe
        double a = x;
        // Näherungswert
        double b = 1;
  
        for(int i = 0; i <=100; i++){
            b = (a+b)/2;
            a = x/b;
        }
        return a;
    }
    public static void main(String[] args){
        System.out.println(heron_methode(49));
    }
}
```

Die Idee ist ja, dass man einen Näherungswert hat (b) und eine Eingabe z.b. 49
*Eingabe x*,* Näherungswert b*. Das nähert man jetzt Schrittweise an.
Das lässt sich leicht in C# übersetzen 

Ich habe das für mein Numerik Seminar von ein paar Tagen auch selbst noch gebraucht (halt nur in Java)

Der *wesentliche Trick* besteht eigentlich im Näherungswert, den kann man grob schätzen, oder so allgemein halten, wie ich das gemacht habe. Bei der Wurzel aus 49,5 liegt es aber nahe eine Näherung von 7 anzupeilen (da sqrt(49)=7, also sqrt(49,5)>7...


----------



## Feeder (10. Aug 2018)

JavaUndC-Prog hat gesagt.:


> Hi in Java sieht das c.a so aus:
> 
> 
> ```
> ...



Es existieren tatsächlich Leute die auf deutsch Code verfassen... Coole Sache


----------

