Ergebnis 1 bis 9 von 9
  1. #1
    Don't be evil Avatar von gigu
    Registriert seit
    03.09.2008
    Beiträge
    267

    Standard In C Wurzel ziehen

    Hallo
    Könntet ihr mir sagen wie man in C eine Wurzel zieht. Oder wie man das überhaupt berechnet?
    Danke :>
    ach ja.. und wenn ihr sonst noch ein Fehler findet und in mir sagt bin ich natürlich dankbar

    Code:
      #include <stdio.h>
      #include <conio.h>
      #include <math.h>
      #include <cmath>
      #include<iostream.h>
    
    
      char Wert;
      float Zahl1;
      float Zahl2;
      float Ergebniss;
    
    
      int main()
    
      {
        //Eingabe
        printf("Pythagoras\n\nKatheten und Hypotenusenberechnung\n\nGeben sie ein was sie berechnen wollen:\n k=Kathete\n h=Hypotenuse\n");
        fflush (stdin);
        scanf("%c", &Wert);
    
        if(Wert == 'h')
            printf("Sie berechnen Hypotenusen");
        else if(Wert == 'k')
            printf("Sie berechnen Katheten");
        else
        printf("Die Eingabe war ungueltig");
    
        //Berechnung von Hypotenuse
        if(Wert == 'h')
        {
            printf("\n\n\nGeben sie die beiden Zahlen die fuer die Hypotenusenberechung verwenden wollen\n");
            printf("\nGeben sie die erste Zahl ein:\n", Zahl1);
            fflush (stdin);
            scanf("%f", &Zahl1);
                if(Zahl1 <= 0)
                printf("Die Eingabe war ungueltig");
                else
            printf("\nGeben sie nun die zweite Zahl ein:\n", Zahl2);
            fflush (stdin);
            scanf("%f", &Zahl2);
                if(Zahl1 <= 0)
                printf("Die Eingabe war ungueltig");
                else
                {
            Ergebniss = (Zahl1*Zahl1)+(Zahl2*Zahl2);
            double wurzel;
            Ergebniss = sqrt(Ergebniss);
            printf("\nDas ergebniss lautet: %f%\n", Ergebniss);
                }
        }
    
        //Berechnung von Kathete
        if(Wert == 'k')
        {
            printf("\n\n\nGeben sie die beiden Zahlen die fuer die Kathetenberechung verwenden wollen\n");
            printf("\nGeben sie die Hypotenuse ein:\n", Zahl1);
            fflush (stdin);
            scanf("%f", &Zahl1);
                if(Zahl1 <= 0)
                printf("Die Eingabe war ungueltig");
                else
            printf("\nGeben sie nun die gegebene Kathete ein:\n", Zahl2);
            fflush (stdin);
            scanf("%f", &Zahl2);
                if(Zahl1 <= 0)
                printf("Die Eingabe war ungueltig");
                else if(Zahl2 >= Zahl1)
                printf("Die Eingabe war ungueltig");
                else
                {
            Ergebniss = (Zahl1*Zahl1)-(Zahl2*Zahl2);
            double wurzel;
            Ergebniss = sqrt(Ergebniss);
            printf("\nDas ergebniss lautet: %f%\n", Ergebniss);
                }
    
        }
    
    
    
        getch();
    
      }

  2. #2
    CIH-Virus Avatar von krusty
    Registriert seit
    12.10.2008
    Beiträge
    445

    Standard

    also in c++ sieht das ganze so aus
    Code:
    #include <cmath>
    double wurzel;
    wurzel = sqrt(zahl);
    glaub ich zumindest :?

  3. #3
    Don't be evil Avatar von gigu
    Registriert seit
    03.09.2008
    Beiträge
    267

    Standard

    Ja das funktiniert.
    Vielen Dank

  4. #4
    CIH-Virus Avatar von krusty
    Registriert seit
    12.10.2008
    Beiträge
    445

    Standard

    no problemo, kannst ja noch fehlermeldungen einbauen, wenn jemand eine negative zahl eingibt use...

  5. #5
    Don't be evil Avatar von gigu
    Registriert seit
    03.09.2008
    Beiträge
    267

    Standard

    is das so korrekt?

  6. #6
    Anfänger
    Registriert seit
    05.09.2008
    Beiträge
    16

    Standard

    wenn du die funktion nicht kennen würdest dann kannst du auch
    mathemtisch ran gehen...^^

    man nimmt eine linke intervall grenze und eine rechte intervall grenze
    meinetwegen double l,r //wobei l = 0 und r = Radikant
    dann (l+r)/2 //also die mittlere zahl
    wenn ((l+r)/2) * ((l+r)/2) größer als der gewünschte radikant ist
    dann (l+r)/2 = r
    wenn ((l+r)/2) * ((l+r)/2) kleiner als der radikant ist dann
    (l+r)/2 = l
    dass kannst du dann in einer schleife so lange weiter machen bis:
    | ((l+r)/2) * ((l+r)/2) - Radikant| < 0,00001 // umso mehr nullen vor der 1 stehen, umso genauer wird die wurzel...
    | soll betrag heißen...

    danach gibst du (l+r)/2 aus....

    ich glaube so müsste es auch gehne
    wenn jemand nen fehler entdeckt bitte ich um verzeihung - ist schon spääääät...^^

  7. #7
    Anfänger
    Registriert seit
    03.03.2008
    Beiträge
    25

    Standard

    xD
    Leute es geht auch viel einfacher
    Es gibt die schöne "pow Funktion", die für potenzieren da ist. Und was wissen wir aus dem Matheunterricht?
    Genau folgendes: (xWurzel)2 <=> 2 ^ (1/x). Von daher reicht diese Funktion aus, um Wurzeln zu berechnen

    http://www.cppreference.com/wiki/c/math/pow

    MfG Blood.
    [S] Nette Leute

    [Ironie]
    [S] Imba FUD Crypter
    [B] PSC, 11!! NonPub Wissen
    [/Ironie]

  8. #8
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Zitat Zitat von Deathskull
    Leute es geht auch viel einfacher
    "Wieso das Rad neu erfinden"?
    Weil das selbstgebaute Rad vielleicht besser läuft als das alte.

    Ich kann natürlich auch sagen, dass ich mit root(3, 0.5) das Quadrat von 3 berechnen kann.

    Es gillt:
    pow(x, y/z) = root(x, z/y);

    root über pow zu definieren macht also nur Sinn, wenn du den genauen Aufbau von pow kennst!

    @xparet0209
    Ich habe deinen Weg mal aus Neugierde ausprobiert und es hat mir bei f(x) immer nur x/2 zurückgegeben... vielleicht habe ich auch Mist gebaut - ist schon "spääääät" ^^

    Außerdem habe ich hier mal das Heron-Verfahren implementiert:
    Code:
    double _sqrt_(double r)
    {
    	double x_n = HERON_X_0;
    	int loops = HERON_MAX_LOOPS;
    	
    	while(loops--)
    	{
    		x_n = (x_n + r / x_n) / 2;
    	}
    	return x_n;
    }
    Bei folgenden Makros habe ich recht genaue Werte erzielen können:
    Code:
    #define HERON_X_0 1
    #define HERON_MAX_LOOPS 100
    http://de.wikipedia.org/wiki/Heron-Verfahren

    Je größer HERON_MAX_LOOPS gewählt ist, desto genauer ist das Ergebnis (natürlich ist die Genauigkeit duch die Maximalwerte eines Doubles begrenzt und zu hohe Werte verlängern die Rechenleistung)!

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  9. #9
    Anfänger
    Registriert seit
    05.09.2008
    Beiträge
    16

    Standard

    ich hab das jetzt mal so geschrieben...
    ich weiß ich nicht ganz so guter programmier stil^^
    außerdem in c# und nicht c
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Quadratwurzel
    {
    class Program
    {
    static void Main(string[] args)
    {
    decimal l, r ,x , m , g_out;
    double g;
    string y;
    Console.Write("Bitte geben Sie einen Radikanten ein: ");
    x = Convert.ToDecimal(Console.ReadLine());
    Console.Write("\nBitte geben Sie die Anzahl der Nachkommastellen an: ");
    g = Convert.ToDouble(Console.ReadLine());
    if (g == 0)
    {
    g_out = 0;
    }
    else
    {
    g_out = Convert.ToDecimal(1 / System.Math.Pow(10, g));
    }
    Console.Write("\n");
    r = x;
    l = 0;
    do{
    Console.WriteLine("[{0};{1}]",l,r);
    m = (l + r) / 2;
    if (m * m > x)
    {
    r = m;
    }
    else
    {
    if (m * m == x)
    {
    break;
    }
    l = m;
    }
    }while( m*m-x > g_out || x- m*m > g_out );
    y = Convert.ToString(m);
    Console.Write("Die Quadratwurzel aus {0} mit der Genauigkeit\n{1} ist ", x, g_out);
    if (g == 0)
    {
    Console.Write(m);
    }
    else
    {
    for (int i = 0; i - 2 != g; i++)
    {
    Console.Write(y[i]);
    }
    }

    Console.ReadLine();
    }
    }
    }

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •