Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Algorithmen (http://www.informatikerboard.de/board/board.php?boardid=17)
----- C++ Maschinengenauigkeit und Summen (http://www.informatikerboard.de/board/thread.php?threadid=2564)


Geschrieben von Marcell99 am 14.11.2015 um 14:24:

  C++ Maschinengenauigkeit und Summen

Meine Frage:
1)Die Maschinengenauigkeit € {epsilon} lässt sich als die kleinste positive Gleitkommazahl € {epsilon} ermitteln, so dass rd(1 + ?) > 1. Verwenden Sie dieses Verfahren um je ein C/C++ Programm zu schreiben, dass die Maschinengenauigkeit epsilon des float-, double- bzw. long double-Gleitkommasystems ermittelt.



2)Schreiben Sie ein C/C++ Programm welches für gegebenes n ? N den Wert der
Summe
s[n] = [n]Sigma[/k=1] 1/k^2

ausgibt. Überlegen Sie sich wie groß n gewählt werden muss damit alle Summanden für k > n kleiner als 10^(-6) sind.




Meine Ideen:
ich hab grad angefangen mit dem programmieren deswegen bin ich total überfordert mit der Aufgabe.

Kann jemand die Aufgaben mit mir schritt für schritt zusammen machen oder Ansätze geben. ich blick da grad echt nicht durch :/



Geschrieben von eulerscheZahl am 14.11.2015 um 15:36:

 

Aufgabe1:
Definiere ein Epsilon > 0 (z.B. 0.01). Solange (1+Epsilon > 1) kannst du das Epsilon verringern (halbieren). Damit kriegst du schon einen ganz brauchbaren Wert.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
#include <stdio.h>

int main() {
	double epsilon = 0.01;
	double epsilonValid;
	while (1 + epsilon > 1)
	{
		epsilonValid = epsilon;
		epsilon /= 2;
	}
	printf("%g\n", epsilonValid);
}


Aufgabe 2:
[latex]s(n) = \sum_{k=1}^n\frac{1}{k^2}[/latex].
Was brauchst du beim Programmieren, um die Summenformel umzusetzen, wo ja mehrfach addiert wird?



Geschrieben von Marcell99 am 14.11.2015 um 15:40:

 

int main(int argc, const char * argv[]) {

float a=4.0;
while (true) {
if (1.0+a>1.0) {
break;
}
a *=4;
}

cout<<"ergebnis"<<a<<endl;

double eps =0.5;
while (true) {
if (1.0 + eps> 1.0) {
break;
}
eps *=0.5;
}


cout<<"ergebnis "<<eps<<endl;

long double b=7.844;
while (true) {
if (1.0+b>1.0) {
break;
}
}
cout<<"ergebnis "<<b<<endl;

also ist dann meine Lösung falsch ;/



Aufgabe 2 )

so muss ich das eingeben
wenn das dir weiterhilft

#include <iostream>
using namespace std;
int main()
{
double sum; // Summe
int i,n;
cout <<"n eingeben"<<endl;
cin >> n;
sum=0.;
for (i=1;i<=n;i=i+1)
{
sum=sum+i-1./3.;
}
cout <<"Summe ist "<<sum<<endl;
}



Geschrieben von eulerscheZahl am 14.11.2015 um 15:54:

 

Die erste passt so nicht:
Zitat:
code:
1:
2:
3:
4:
5:
6:
7:
8:
float a=4.0;
while (true) {
if (1.0+a>1.0) {
break;
}
a *=4;
}
cout<<"ergebnis"<<a<<endl;

hier brichst du die Schleife nach dem ersten Durchlauf ab, ohne a geändert zu haben. Und wenn dein a klein genug wäre, würdest du in einer Endlosschleife landen.

Aufgabe 2 sieht schon besser aus, du musst nur die Berechnungsformel in der Schleife korrigieren. Und verwende bitte [code]...[/code], um deinen Code einzubetten.



Geschrieben von Marcell99 am 14.11.2015 um 16:00:

 

aber warum passt das nur bei dem ersten nicht, bei den anderen geht das auch, wo ist denn der Unterschieden, wegen float????

2) #include <iostream>
using namespace std;
int main()
{
double sum; // Summe
int k,n;
cout <<"n eingeben"<<endl;
cin >> n;
sum=0.;
for (k=1;k>n;k++)
{
sum=sum+k+1./k*k.;
}
cout <<"Summe ist "<<sum<<endl;
}

so besser???



Geschrieben von eulerscheZahl am 14.11.2015 um 16:06:

 

Zur 1: die anderen sind genauso verkehrt, ich dachte es reicht, das am float zu erklären.

Zur 2:
sum=sum+k+1./k*k;
Das rote k steht so nicht in der Formel, das muss raus.
Mit der Formel berechnest du übrigens [latex]\frac{1}{6}\pi^2[/latex]



Geschrieben von Marcell99 am 14.11.2015 um 16:10:

 

daaaaanke smile )))

jaa dann mach ich das mal mit deiner Lösung aber was ist denn bei dir epsilonValid;
warum steht das denn da, kann man das nicht weglassen???


denn wenn ich bei der letzten Zeile

printf("%g\n", epsValid);

schreibe wird es als Fehler angesehen erst wenn ich das in epsilon ändere, kann ich das Programm laufen lassen ://



Geschrieben von eulerscheZahl am 14.11.2015 um 16:14:

 

Wenn ich epsilon halbiere, bin ich ja irgendwann zu klein. Das merke ich aber erst, wenn es schon zu spät ist. Daher speichere ich zusätzlich den letzten Wert, für den es noch geklappt hat. Aber dank des Aufbaus von float/double könnte ich danach auch einfach wieder *2 rechnen, statt eine zweite Variable zu verwenden.

Edit (zu deinem edit):
bei mir heißt die Variable ja auch epsilonValid und nicht epsValid.



Geschrieben von Marcell99 am 14.11.2015 um 16:47:

 

#include <stdio.h>

int main(int argc, const char * argv[]) {

float Zahla=1.0f;
float Zahlb;
while ((1+Zahla) >1) {
Zahla=Zahlb;
Zahlb /=2;
}

printf("%f\n",Zahla);

double epsilon = 0.01;
double epsilonValid;
while ((1 + epsilon) > 1)
{
epsilonValid = epsilon;
epsilon /= 2;
}
printf("%g\n", epsilon);



long double c=0.0234l;
long double d;
while ((1+c)>1) {
d=c;
c/=2;
}

printf("%l\n",c);

return 0;
}



kann ich das so lassen ??? sag bitte ja :/



Geschrieben von eulerscheZahl am 14.11.2015 um 16:54:

 

Schau dir beim float nochmal an, wo du welche Variable verwenden musst.



Geschrieben von Marcell99 am 14.11.2015 um 16:57:

 

was meinst du jetzt damit ??



Geschrieben von eulerscheZahl am 14.11.2015 um 16:59:

 

Du teilst Zahlb durch 2, obwohl diese anfangs die temporäre Variable ist. Gleiches gilt für die Zuweisung, bei der du die Reihenfolge vertauscht hast.



Geschrieben von Marcell99 am 14.11.2015 um 17:03:

 

ok hab es geändert
soo meinst du das oder ??

float Zahla=1.0F;
float Zahlb;
while ((1+Zahla) >1) {
Zahlb=Zahla;
Zahlta =1.0;

printf("%f\n",Zahla);


bei long double das selbe ??



Geschrieben von eulerscheZahl am 14.11.2015 um 18:39:

 

Bei long double passt alles.
Jetzt fehlt dir ein '}', die Variable heißt Zahlta statt Zahla und du setzt sie auf 1, statt sie zu halbieren.



Geschrieben von Marcell99 am 14.11.2015 um 18:43:

 

ich hab die ja bei Zahl a auf 1 gesetzt


Forensoftware: Burning Board, entwickelt von WoltLab GmbH