tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
878
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dunklestoast Tutorials.de Gastzugang
    Ich arbeite gerade an einem Programm das Pi auf soviele Stellen hinter dem Komma wie man will berechnet (falls möglich).

    Das ist mein erstes Problem:
    Die variable double speichert, wenn ich mich nicht irre, nur 8 Stellen nach dem Komma ab, ich brauche jedeoch einen Variablen-Typ der mir unbegrenzte Stellen erlaubt.

    Ansonsten könnte ich auch PI mit ..... Nachkommastellen kopieren. Da kommt es zu meiner nächsten Frage:
    Kann ich eine Zahl (in dem Fall die Nachkommastellen von PI) in einer externen Datei speichern? Und wie kann ich sie in mein anderes Dokument einfügen? (Windows Forms)
    Ich möchste das es dann so ausgegeben wird:
    (Variablentyp) pi = 3, (externe Datei);

    Frage 3:
    Falls das oben funktioniert, möchte ich das man die Zahl runden kann. Ich weis nicht wie es funktioniert, allerdings soll die oben gezeigte Variable aufgerufen werden, und die externe Datei auf soviele Stelllen gerundet werden, wie die Variable "anzahl" angibt.

    Es währe shön wenn mir jemand helfen könnte. Und da ich noch ein Anfänger bin, würde ich mich auch über Erläuterrungen freuen
     

  2. #2
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Mehr als 15 bis 16 Stellen Genauigkeit solltest du nie benötigen in deinem Algorithmus, da praktisch keine Rechnung unterhalb 10^-16 numerisch genau ist. Unbeschränkte Stellen gibt es nicht. Finde einen Algorithmus der das umgehen kann indem du nicht mehr Genauigkeit auf einmal brauchst und einfach sequentiell die nächste Kommastelle berechnest.

    2.
    Ja, du kannst das über System::IO::FileStream einlesen und auslesen. Du kannst dann einen string erstellen mit string strvar = "3." + inhalt; und über double.TryParse umwandeln. Aber auch da: mehr als 16 Stellen Genauigkeit wirst du nicht bekommen.

    3.
    Da du sowieso schon einen anderen Weg für grosse Nachstellenzahl finden musst wird das auch nicht in einer Variabeln gespeichert, daher kann man das dann später noch genauer anschauen.
     

  3. #3
    Dunklestoast Tutorials.de Gastzugang
    So, ich habe jetzt mal etwas aus Java in C# übersetzt, womit man, nach wikipedia, einigermaßen pi berechnen kann.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                    berechne_pi();
                    Console.ReadLine();
            }
                    public static double berechne_pi(int tropfenzahl)
            {
                double pi = 0;
                int innerhalb = 0;
                int gesamt = tropfenzahl;
     
                while (tropfenzahl > 0)
                { // generiere Tropfen und addiere je nach Zugehörigkeit
                    double dotx = Convert.ToDouble(new Random());
                    double doty = Convert.ToDouble(new Random());
     
                    if (dotx * dotx + doty * doty <= 1)
                    {
                        // Punkt liegt innerhalb des Kreises
                        innerhalb++;
                    }
                    else
                    {
                        // Punkt liegt außerhalb des Kreises
                    }
     
                    tropfenzahl--;
                }
     
                pi = 4 * (double)innerhalb / gesamt;
                return pi;
            }
        }
    }
    http://de.wikipedia.org/wiki/Kreiszahl <--- statische Bestimmungen
    Aber irgendwie bekomme ich kein Ergebnis, sondern nur eine Fehlermeldung: "Keine Überladung für die berechne_pi-Methode nimmt 0 Argumente an."
    Ich weiß leider nicht was ich falsch gemacht habe, hoffentlich kann jemand helfen :S

    PS: Thx @ Cromon für die vorherigen Antworten
     

  4. #4
    ds3650 ds3650 ist offline Mitglied
    Registriert seit
    May 2005
    Beiträge
    10
    Da du deine Methode berechni_pi mit einem Int-Parameter deklariert hast, musst du in deiner Main natürlich der Methode einen Parameter mitgeben.
     

  5. #5
    Dunklestoast Tutorials.de Gastzugang
    Kannst du vllt genauer erläutern was du meinst? ich verstehe icht so recht :S
     

  6. #6
    ds3650 ds3650 ist offline Mitglied
    Registriert seit
    May 2005
    Beiträge
    10
    Deine Methodendeklaration sieht wie folgt aus:


    public static double berechne_pi(int tropfenzahl) <----- (hier hast du angegeben, dass eine Zahl als Parameter übergeben werden soll)
    {
    double pi = 0;
    //Verarbeitung deiner Methode
    ....
    return pi;
    }


    Nun hast du die oben genannte Methode wie folgt in deiner Main aufgerufen:

    berechne_pi(); <--- da hier KEIN Parameter übergeben wurde, haut dir der Compiler auf die Finger


    Deshalb musst du eine Zahl beim Methodenaufruf mitgeben:


    static void Main(string[] args)
    {
    Console.WriteLine("Geben Sie eine Zahl ein");
    int zahl = Int32.Parse(Console.ReadLine());
    //jetzt könntest du noch überprüfen, ob es auch wirklich eine Zahl ist, etc

    // und die eingegebene Zahl übergibst du jetzt der Methode

    //Rückgabewert abspeichern
    double ergebnis = berechne_pi(zahl);

    //jetzt kannst du mit dem Ergebnis machen was du willst, beispielsweise auf der Konsole ausgeben:
    Console.WriteLine("PI: " + ergebnis);
    }
    Geändert von ds3650 (12.04.10 um 17:12 Uhr)
     

  7. #7
    Dunklestoast Tutorials.de Gastzugang
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int zahl = Convert.ToInt32("1");
                berechne_pi(zahl);
                Console.ReadLine();
            }
            public static double berechne_pi(int tropfenzahl)
            {
                double pi = 0;
                int innerhalb = 0;
                int gesamt = tropfenzahl;
     
                while (tropfenzahl > 0)
                { // generiere Tropfen und addiere je nach Zugehörigkeit
                    double dotx = Convert.ToDouble(new Random());
                    double doty = Convert.ToDouble(new Random());
     
                    if (dotx * dotx + doty * doty <= 1)
                    {
                        // Punkt liegt innerhalb des Kreises
                        innerhalb++;
                    }
                    else
                    {
                        // Punkt liegt außerhalb des Kreises
                    }
     
                    tropfenzahl--;
                }
     
                pi = 4 * (double)innerhalb / gesamt;
                return pi;
            }
        }
    }
    "Das Objekt des Typs "System.Random" kann nicht in Typ "System.IConvertible" umgewandelt werden."

    Eine neue Fehlermeldung. Erscheint beim Compilern...
     

  8. #8
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Code csharp:
    1
    
    (new Random()).Next()
    könnte funktionieren (habe es nicht getestet)
    Mit "new Random" erstellst du ein neues Objekt, welches dir Zufallszahlen generiert. Mit der Next-Methode lässt du dir dann aber erst die Zufallszahl ausgeben. Es wäre übrigens sinnvoller, nur ein einziges Random-Objekt zu erzeugen und dann immer die Next-Methode aufzurufen, anstatt bei jedem Mal ein neues Objekt zu erstellen.
    Die Next-Methode gibt dir aber Integer-Zahlen aus; was du willst ist aber eine Zahl zwischen 0 und 1. --> Pi wird bei dir nicht korrekt berchnet werden.
    Du müsstest also sowas schreiben:
    Code csharp:
    1
    
    Random.Next() / Integer.MaxValue
     

Ähnliche Themen

  1. Anfänger hat Fragen zu C++.
    Von Zeestick im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 25.10.10, 22:45
  2. Anfänger Fragen
    Von =fire= im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 27.01.08, 13:34
  3. Anfänger Fragen
    Von Thomasio im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 11.08.06, 21:15
  4. Anfänger-Fragen
    Von Erpel im Forum Linux & Unix
    Antworten: 23
    Letzter Beitrag: 03.09.03, 10:26
  5. anfänger fragen
    Von HITMAN im Forum PHP
    Antworten: 16
    Letzter Beitrag: 26.03.02, 18:36