Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » C++ Maschinengenauigkeit und Summen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (5): [1] 2 3 nächste » ... letzte » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen C++ Maschinengenauigkeit und Summen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

C++ Maschinengenauigkeit und Summen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 :/

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Marcell99: 14.11.2015 15:05.

14.11.2015 14:24 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?

__________________
Syntax Highlighting fürs Board (Link)
14.11.2015 15:36 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
14.11.2015 15:40 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 14.11.2015 15:54.

14.11.2015 15:54 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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???

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Marcell99: 14.11.2015 16:04.

14.11.2015 16:00 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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]

__________________
Syntax Highlighting fürs Board (Link)
14.11.2015 16:06 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 ://

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Marcell99: 14.11.2015 16:14.

14.11.2015 16:10 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 14.11.2015 16:15.

14.11.2015 16:14 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

#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 :/
14.11.2015 16:47 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

__________________
Syntax Highlighting fürs Board (Link)
14.11.2015 16:54 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

was meinst du jetzt damit ??
14.11.2015 16:57 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
14.11.2015 16:59 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 ??

Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Marcell99: 14.11.2015 17:14.

14.11.2015 17:03 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
14.11.2015 18:39 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Marcell99
Eroberer


Dabei seit: 14.11.2015
Beiträge: 53

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

ich hab die ja bei Zahl a auf 1 gesetzt
14.11.2015 18:43 Marcell99 ist offline E-Mail an Marcell99 senden Beiträge von Marcell99 suchen Nehmen Sie Marcell99 in Ihre Freundesliste auf
Seiten (5): [1] 2 3 nächste » ... letzte » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » C++ Maschinengenauigkeit und Summen