Quadratwurzel

Hi das hatte ich mal geschrieben gehabt. Sollte funktionieren:

PHP:
<?php

$x = 81;

$x = split("\.",$x);

$int = (strlen($x[0]))/2;
$int2 = split("\.",$int);

if ($int2[0] == $int) {
  $eins = substr($x[0],0,2);
	$zahlen=2;
} else {
  $eins = substr($x[0],0,1);
	$zahlen=1;
}

for($i=0; $i<$eins; $i++) {
  if (($i*$i) <= $eins) {
	  $ergebniss = $i;
		$Rest = $eins-($i*$i);
	}
}

for ($i=$zahlen; $i<(strlen($x[0])); $i+=2) {
  $number=substr($x[0],$i,2);
	$number = $Rest.$number;
	$ergeb2 = $ergebniss*2;
	$ergeb4 = 0;
	for ($j=0; $j<10; $j++) {
	  $ergeb3 = $ergeb2.$j;
		if (($ergeb3*$j) <= $number) {
		  $ergeb4 = $j;
			$Rest = $number-($ergeb3*$j);
		}
	}
	$ergebniss.=$ergeb4;
}

if (!isset($x[1])) {
  $x[1] = "";
}

for ($i=0; $i<(strlen($x[1])); $i+=2) {
  $number=substr($x[0],$i,2);
	$number = $Rest.$number;
	$ergeb2 = $ergebniss*2;
	$ergeb4 = 0;
	for ($j=0; $j<10; $j++) {
	  $ergeb3 = $ergeb2.$j;
		if (($ergeb3*$j) <= $number) {
		  $ergeb4 = $j;
			$Rest = $number-($ergeb3*$j);
		}
	}
	$ergebniss.=$ergeb4;
}
if ($Rest != 0) {
  $ergebniss .= ".";
	$a=0;
  while($Rest != 0) {
	  $a++;
    $number= 00;
	  $number = $Rest.$number;
	  $ergeb2 = $ergebniss*2;
	  $ergeb4 = 0;
	  for ($j=0; $j<10; $j++) {
	    $ergeb3 = $ergeb2.$j;
		  if (($ergeb3*$j) <= $number) {
		    $ergeb4 = $j;
			  $Rest = $number-($ergeb3*$j);
		  }
	  }
	  $ergebniss.=$ergeb4;
		if($a == 100) {
		  $Rest =0;
		}
  }
}

print $ergebniss;

?>

Jon2
 
Funktioniert nur bitte beachte
Aufgabe:
Schreibe ein Programm das die Quadratwurzel von x errechnet.

Besonderheiten:

* Lass den User zwischen mindestens 2 Verfahren wählen.
* Gib die zwischenschritte aus


@Xalon: Nein. Ich will wissen , bis wohin ich nach dem Komma Rechnen soll, wenn es sich um eine Irrationale (nicht endene, nicht periodische) Zahl handelt
 
Hab mal was in C gecodet. Ich weiss mein C is schäbig, aber es funktioniert.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float pow_n(int x, int n)
{
	int r = x;
	for(int i = 1; i < n; i++)
	{
		r = r * x;
	}

	return r;
}

float heron(int n, int d)
{
	float x = 1.0f;
	for (int i = 0; i < d; i++)
	{
		x = (x + (n / x)) / 2;
	}

	return x;
}

float naeherung(int n, int d)
{
	float x = 0.0f;
	for(int i = 0; i < d; i += 1)
	{
		if(i == 0)
		{
			for(int j = 0; j < n; j++)
			{
				float a = j * j;
				if(a <= n) {
					x = j;
					if(a == n) {
						return j;
					}
				} else {
					break;
				}
			}

		}
		else
		{
			float buf = 0.0f;
			for(float j = 0.0f; j < n; j += 1/pow_n(10, i))
			{
				float a = (x+j) * (x+j);
				if(a < n) {
					buf = j;
				} else {
					x = x + buf;
					break;
				}
			}
		
		}
	}

	return x;
}

int main(int argc, char** argv)
{
	if(argc < 3)
	{
		printf("USEAGE:\n" \
				"\twurzel NUMMER TIEFE METHODE\n\n" \
				"\t\tNUMMER\tDie Nummer aus der die Wurzel gezogen werden soll.\n" \
				"\t\tTIEFE\tGibt an wie genau die Wurzel sein soll.\n" \
				"\t\tMETHODE\tDie Methode die gewählt werden soll.\n" \
				"\t\t\tZur Auswahl stehen Heron-Verfahren (0) und Näherunsg-Verfahren (1).\n");
		return 0;
	}
	int n = atoi(argv[1]);
	int d = atoi(argv[2]);
	int m = atoi(argv[3]);

	switch(m)
	{
		case 0:
			{
				float x = heron(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
		case 1:
			{
				float x = naeherung(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
	}

	return 0;
}
 
So hab schon was stehen. konnte aber aus Zeitmangel nicht Einrücken, alles nochma durchgehen. Bisher kann man das Heron verfahren wählen und jede x-beliebige Zahl benutzten. DIe Intervall-Schachtelung werde ich Morgen machen, da ich noch mehr als genug heute zu tun hab ^^
Außerdem wär es nett wenn ma jemand gucken würde, warum die selbe ausgabe erzeugt wird wenn man nichts auswählt und wenn Die Intervall-Schachtelung ausgewählt wurde.

Also hier das Eingabe-Formular :
Code:
<html>
     <head>
     <title>Quadratwurzel ziehen</title>
     </head>
     <body>
     Bitte gebe eine Zahl an, aus der die Quadratwurzel gezogen werden soll.<br /><br />
     
     <form action="http://rider.ri.ohost.de/wurzel_script.php">
     <input name="zahl" type="text" value="Zahl" /> <br />
     Nun wähle bitte noch das Verfahren, mit dem Die Quadratwurzel errechnet werden soll. <br /> <br />
     Heron-Verfahren:       <input name="verfahren"     type="radio" value="1" /> <br />
     Intervall-Schachtelung: <input name="verfahren" type="radio" value="0" /> <br />
     <input type="submit" value="Wurzeln XD" />
     </form>
     </body>
     </html>
Und nun noch der PHP-Teil
PHP:
<?php 
     //User Angaben mal einbeziehen ^^
     $zahl      = $_GET['zahl'];
     $verfahren = $_GET['verfahren'];
     
     //Eingabe = Zahl?
     if (is_numeric($zahl)) { 
                        
                        // <heron>
                        if ($verfahren == 1) { 
                        
                        $naeherungx = 1;
                        $naeherungy = ($zahl/$naeherungx);
                        while(($naeherungx * $naeherungx) != $zahl) { //<while>
                        $naeherungy = ($zahl/$naeherungx);
                             echo "Näherung X : ".$naeherungx."<br>";
                             echo "Näherung Y : ".$naeherungy."<br>";
                             echo "Ergebniss: <br>";
                             if(1 > $zahl) { echo "Die Wurzel aus 0 ist 0. "; 
                             }else { // Zahl != 0 !
                             echo "1 < √".$zahl." < ".$naeherungy."<br>"; //mal das ergebnis zur übersicht ausgeben ^^
                             $naeherungx = (($naeherungx+$naeherungy)/2);       //neue Näherung ermitteln
                             echo "Neue Näherung X :".$naeherungx."<br>";  //und Ausgeben 
                            } // </else> Bei Zahl != 0
                           } // </while>
                          } else { if ($verfahren == 0) { echo "Musst noch warten ;)";
                          } if ($verfahren != 0) { echo "Bitte wähle ein Verfahren aus."; }
                          //... kommt demnächst muss aber jetzt Franz lernen ^^
                           } // </else> Verfahren prüfung
                         } else { echo"Bitte gebe eine Zahl ein."; }        
                        
  
?>

Auszuprobieren auf meiner Seite
achja ich muss noch einstellen, wenn sich die letzten nach komma zahenl sich nich ändern, dass dann abgebrochen wird ^^
 
Original von M@rex
Hab mal was in C gecodet. Ich weiss mein C is schäbig, aber es funktioniert.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float pow_n(int x, int n)
{
	int r = x;
	for(int i = 1; i < n; i++)
	{
		r = r * x;
	}

	return r;
}

float heron(int n, int d)
{
	float x = 1.0f;
	for (int i = 0; i < d; i++)
	{
		x = (x + (n / x)) / 2;
	}

	return x;
}

float naeherung(int n, int d)
{
	float x = 0.0f;
	for(int i = 0; i < d; i += 1)
	{
		if(i == 0)
		{
			for(int j = 0; j < n; j++)
			{
				float a = j * j;
				if(a <= n) {
					x = j;
					if(a == n) {
						return j;
					}
				} else {
					break;
				}
			}

		}
		else
		{
			float buf = 0.0f;
			for(float j = 0.0f; j < n; j += 1/pow_n(10, i))
			{
				float a = (x+j) * (x+j);
				if(a < n) {
					buf = j;
				} else {
					x = x + buf;
					break;
				}
			}
		
		}
	}

	return x;
}

int main(int argc, char** argv)
{
	if(argc < 3)
	{
		printf("USEAGE:\n" \
				"\twurzel NUMMER TIEFE METHODE\n\n" \
				"\t\tNUMMER\tDie Nummer aus der die Wurzel gezogen werden soll.\n" \
				"\t\tTIEFE\tGibt an wie genau die Wurzel sein soll.\n" \
				"\t\tMETHODE\tDie Methode die gewählt werden soll.\n" \
				"\t\t\tZur Auswahl stehen Heron-Verfahren (0) und Näherunsg-Verfahren (1).\n");
		return 0;
	}
	int n = atoi(argv[1]);
	int d = atoi(argv[2]);
	int m = atoi(argv[3]);

	switch(m)
	{
		case 0:
			{
				float x = heron(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
		case 1:
			{
				float x = naeherung(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
	}

	return 0;
}
Es funktioniert nicht wirklich:
Code:
C:\Programme\Dev-Cpp>projekt1 133333 3 0
Die Wurzel aus 133333 ist 16669.250000!

C:\Programme\Dev-Cpp>projekt1 133333 3 1
Die Wurzel aus 133333 ist 365.140015!

Ich weiss auch nicht was du da beim Heron Verfahren gebaut hast ^^
 
Original von sd333221
Original von M@rex
Hab mal was in C gecodet. Ich weiss mein C is schäbig, aber es funktioniert.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

float pow_n(int x, int n)
{
	int r = x;
	for(int i = 1; i < n; i++)
	{
		r = r * x;
	}

	return r;
}

float heron(int n, int d)
{
	float x = 1.0f;
	for (int i = 0; i < d; i++)
	{
		x = (x + (n / x)) / 2;
	}

	return x;
}

float naeherung(int n, int d)
{
	float x = 0.0f;
	for(int i = 0; i < d; i += 1)
	{
		if(i == 0)
		{
			for(int j = 0; j < n; j++)
			{
				float a = j * j;
				if(a <= n) {
					x = j;
					if(a == n) {
						return j;
					}
				} else {
					break;
				}
			}

		}
		else
		{
			float buf = 0.0f;
			for(float j = 0.0f; j < n; j += 1/pow_n(10, i))
			{
				float a = (x+j) * (x+j);
				if(a < n) {
					buf = j;
				} else {
					x = x + buf;
					break;
				}
			}
		
		}
	}

	return x;
}

int main(int argc, char** argv)
{
	if(argc < 3)
	{
		printf("USEAGE:\n" \
				"\twurzel NUMMER TIEFE METHODE\n\n" \
				"\t\tNUMMER\tDie Nummer aus der die Wurzel gezogen werden soll.\n" \
				"\t\tTIEFE\tGibt an wie genau die Wurzel sein soll.\n" \
				"\t\tMETHODE\tDie Methode die gewählt werden soll.\n" \
				"\t\t\tZur Auswahl stehen Heron-Verfahren (0) und Näherunsg-Verfahren (1).\n");
		return 0;
	}
	int n = atoi(argv[1]);
	int d = atoi(argv[2]);
	int m = atoi(argv[3]);

	switch(m)
	{
		case 0:
			{
				float x = heron(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
		case 1:
			{
				float x = naeherung(n, d);
				printf("Die Wurzel aus %i ist %f!\n", n, x);
				break;
			}
	}

	return 0;
}
Es funktioniert nicht wirklich:
Code:
C:\Programme\Dev-Cpp>projekt1 133333 3 0
Die Wurzel aus 133333 ist 16669.250000!

C:\Programme\Dev-Cpp>projekt1 133333 3 1
Die Wurzel aus 133333 ist 365.140015!

Ich weiss auch nicht was du da beim Heron Verfahren gebaut hast ^^

Doch das funktioniert schon, jedoch konvergiert das Heron-Verfahren nicht schnell genug, daher reichen 3 Iterationen(hier "Tiefe") einfach nicht aus:
Code:
./wurzel 133333 30 0
365.147919
 
So dann noch was von mir ;)
mit 3 Verfahren...
Code:
#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

void sqrt_heron(double x, int m)
{
	double r = 1.0;
	for (int i = 1; i <= m; ++i) {
		r = (r + x/r) / 2;
		cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << r << endl;
	}
}

void sqrt_is(double x, int m)
{
	double a = 0.0, b = x, c;
	for (int i = 1; i <= m; ++i) {
		c = (a + b) / 2;
		cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << c << endl;
		if (c * c > x)
			b = c;
		else
			a = c;
	}
}

void sqrt_schr(double x, int m)
{
	double y = x, r;
	int a = 0, b = 0;
	unsigned long u = 0;
	while (y >= 100.0) {
		y /= 100.0;
		++a;
	}
	
	for (int i = 1; i <= m; ++i) {
		for (b = 1; b < 10; ++b)
			if (20 * u * b + b * b > y)
				break;
		--b;

		r *= 10; r += b;
		y -= 20 * u * b + b * b; y *= 100;
		u *= 10; u += b;

		cout << i << ". Schritt sqrt(" << x << ") ~ " << setprecision(16) << r * pow(10, a) << endl;
		--a;
	}
}

int main()
{
	for (;;) {
		int v, i;
		double w;

		cout << "\nVerfahren der Wurzelbestimmung:" << endl;
		cout << "1 = Heron" << endl;
		cout << "2 = Intervallschachtelung" << endl;
		cout << "3 = schriftliches Wurzelziehen" << endl;
		cout << "0 = Beenden" << endl;
		cin >> v;
		if (v < 1 || v > 3)
			break;

		cout << "Iterationsschritte: " << flush;
		cin >> i;
		if (i < 1)
			break;

		cout << "Radikand: " << flush;
		cin >> w;
		if (w <=0)
			break;

		cout << "Die Quadratwurzel aus " << w << " ist " << setprecision(16) << sqrt(w) << " (zum Vergleich)." << endl;

		switch (v) {
		case 1:	cout << "Heron:" << endl;
				sqrt_heron(w, i);
				break;
		case 2: cout << "Intervallschachtelung:" << endl;
				sqrt_is(w, i);
				break;
		case 3: cout << "schriftliches Wurzelziehen:" << endl;
				sqrt_schr(w, i);
				break;
		};
	}
	return 0;
}
 
Sagt mir bitte, dass ich langweilig bin :D
Code:
#include <iostream>
#include <math.h>

int main()
{
	std::cout << "Bitte die Zahl eingeben: ";
	float eineZahl;
	std::cin >> eineZahl;
	eineZahl = powf(eineZahl,0.5);
	std::cout << std::endl << "Die Quadratwurzel lautet: " << eineZahl << std::endl;
	system("Pause");
}
Edit:
Ich weiss natürlich dass das die Aufgabenstellung nicht erfüllt,
nur so würde ich das in meinen Programmen machen, weil man
meist nicht so genaue Wurzeln braucht, und das klappt ganz gut
 
gerne, du bist langweilig :D

wobei du ja auch sqrt nehmen kannst... ich hab die Funktion auch benutzt, damit man einen direkten Vergleich hat...
 
Wo wir schonmal bei Mathe sind: Wie kann man eigentlich Zahlen mit z.B. 1000 oder mehr Nachkommastellen realisieren, also Programmiertechnisch?

gruß Corni
 
Mach dazu besser einen neuen thread auf... und nenn dann auch die Programmiersprache, da sowas mit den meisten (allen?) Programmiersprachen nicht mit den Standard-Datentypen möglich ist. Man muss da wohl selbst was basteln... wobei es solche Lösungen bestimmt schon im inet gibt...
 
Original von Corni
Wo wir schonmal bei Mathe sind: Wie kann man eigentlich Zahlen mit z.B. 1000 oder mehr Nachkommastellen realisieren, also Programmiertechnisch?

gruß Corni
Naja du bräuchtest dazu einen Algo der die Stellein einzelnd ausgibt :D
Dann kannst du so viele Stellen machen wie du lustig bist,
z.B. in einen Array ;)
 
Ich habe in meinem Programm das Schriftliche Wuzelziehen und die rekursive Methode nach Heron. Sourcecode und Exe liegen im rar Archiv bei. Sourcecode ist auch im Spoiler.

#include<iostream>
using namespace std;
float schriftlich(float);
int schriftl(float,int);
float heron(float,float);
void heroon(float);
void schrift(float,int);
int main()
{
#include<iostream>
using namespace std;
float schriftlich(double);
int schriftl(double,int);
float heron(double,float);
void heroon(double);
void schrift(double,int);
int main()
{
int ganzzahl=0;
double zahl=0;
char method;
cout<<"Welche Methoder\nchriftliches Wurzelziehen\n[H]eron Methode"<<endl;
cin>>method;
cout<<"Geben sie eine Zahl ein: ";
cin>>zahl;
if(method=='S' || method=='s')
{
schrift(zahl,ganzzahl);
}
else if(method=='H' || method=='h')
{
heroon(zahl);
}
return 0;
}

void heroon(double zahl)
{
cout.precision(8);
cout<<"Heron Methode: "<<heron(zahl,1)<<endl;
cin.get();
cin.get();
}

void schrift(double zahl,int ganzzahl)
{
cout.precision(8);
cout<<"Schriftliches Wurzelziehen: "<<schriftl(zahl,ganzzahl)<<","<<schriftlich(zahl)<<endl;
cin.get();
cin.get();
}

float heron(double a, float x)
{
float temp;
const float teiler=2;
x=(x+(a/x))/2;
temp=x*x;
if(temp>a)
{
x=heron(a,x);
}
return x;
}

float schriftlich(double zahl)
{
int ganzzahl;
int i=1;
while(zahl>=i)
{
zahl=zahl-i;
i=i+2;
ganzzahl++;
}
return zahl;
}

int schriftl(double zahl,int ganzzahl)
{
int i=1;
while(zahl>=i)
{
zahl=zahl-i;
i=i+2;
ganzzahl=ganzzahl+1;
}
return ganzzahl;
}
}
 
Bei meinem Verfahren wird die Wurzel per Intervallschachtelung, Heron-Verfahren und PHP-Funktion ;) berechnet:
PHP:
<?php
$zahl = 2; // Zahl, aus der die Wurzel gezogen werden soll
$genauigkeit = 11; // Anzahl der Kommastellen (11 ist bei PHP Maximum)

echo "Wurzel aus der Zahl $zahl auf $genauigkeit Stellen gerundet";

echo "<h1>Intervall-Schachtelung:</h1>";
echo "<b>Ergebnis: ".wurzel_intervall($zahl)."</b><br />";

echo "<h1>Heron-Verfahren:</h1>";
echo "<b>Ergebnis: ".wurzel_heron($zahl)."</b><br />";

echo "<h1>PHP-Funktion:</h1>";
echo "<b>Ergebnis: ".wurzel_php($zahl)."</b><br />";

/*** INTERVALL-SCHACHTELUNG ***/
function wurzel_intervall($zahl) {
   global $genauigkeit;

   $x = 0; // Wert unter Wurzel
   $y = 0; // Wert über Wurzel
   $multi = 1;
   $i = 0; // Counter
   while($i <= $genauigkeit) {
      while($x*$x < $zahl) {
         $x += $multi;
      }
      $y = $x;
      $x -= $multi;
      $multi /= 10;
      $i++;
      echo "Näherung X: $x  Näherung Y: $y<br />";
      echo "$x < √$zahl < $y<br /><br />";
      $wurzel_intervall = $x;
   }
   return $wurzel_intervall;
}

/*** HERONS VERFAHREN ***/
function wurzel_heron($zahl) {
   global $genauigkeit;

   $wurzel_heron = -1;
   $x = 1;
   $i = 0; // Counter
   while(($x * $x) != $zahl) {
      $y = $zahl / $x; // 2 = 2 / 1
      echo "Näherung X: $x  Näherung Y: $y<br />";
      echo "$x < √$zahl < $y<br /><br />";
      $x = ($x + $y) / 2;
      if($x == $wurzel_heron) {
         break;
      } else {
         $wurzel_heron = $x;
      }
   }
   return substr($wurzel_heron, 0, $genauigkeit+2);
}

/*** PHP-Wurzelfunktion ***/
function wurzel_php($zahl) {
   global $genauigkeit;
   $wurzel_sqrt = sqrt($zahl);
   return substr($wurzel_sqrt, 0, $genauigkeit+2);
}
?>
 
Zurück
Oben