Cosinus Funktion

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Cosinus Funktion

Beitrag von anno1988 »

Hallo,

ich schlage mich gerade ein wenig mit Sinus- und Cosinus Funktionen herum.

Code: Alles auswählen


double value = cos(90 * PI / 180);

Wert den ich zurückerhalte:

Code: Alles auswählen


6.1230317691118863e-17

Allerdings ist Cosinus bei 90 Grad ja 0 und nicht "6.1230317691118863e-17".

Bei Sinus habe ich dieses problem allerdings nicht.

mache ich da irgend etwas falsch?
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Der sin() von Qt will das Argument in Grad, der sin() von der Stardard Lib. in Rad.
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

das ist jetzt halt dei frage, welchen ich benutze.

also bisher hat es mit radiant ganz gut funktioniert. daher denke ich, dass es die aus der standard lib ist, nur eben bei den 90 Grad nicht.

denn die "math.h" habe ich ja auch eingebunden.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Nanu, ich finde in der Hilfe vom Qt-Creator nichts mehr über sin(). Dabei hätte ich schwören können, dass ich das da gelesen hatte.

Ok. Das hatte ich schonmal. Du bekommst 6.1230317691118863e-17 raus. Das ist 0. Naja, fast. Das sind eben die Rundungsfehler die man bei Gleitkommazahlen bekommen. Das ist eben so.

Btw. du brauchst keine math.h includieren. Nicht mal cmath. Das geht bei mir auch ohne. Qt macht das schon =) (wenn ich mich jetzt nicht arg irre)
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

welche funktion benutze ich da am besten?

ceil()

floor()

oder doch besser

round()

um auch 0 heraus zu bekommen und dass es auch mit anderen winkeln funktioniert und ich nicht immer für 90 Grad extra etwas hinzu programmieren muss.
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

ich habe mir mal kurz ein kleines testprogramm zusammengebaut.

Code: Alles auswählen


#include <math.h>
#include <iostream>

using namespace std;

int main() {

	double tmp_cos;	
	double tmp_sin;


	for(int i=0; i < 360; i++) {
	
		tmp_cos = cos(i * M_PI / 180);	
		tmp_sin = sin(i * M_PI / 180);	
	
		cout << "Winkel: " << i << "	cos: " << tmp_cos << "	sin: " << tmp_sin << endl;
	
	}
	
	return 0;

}
Das Problem besteht nur bei 90 und 270 grad.

Code: Alles auswählen


...

Winkel: 89	cos: 0.0174524	sin: 0.999848
Winkel: 90	cos: 6.12303e-17	sin: 1
Winkel: 91	cos: -0.0174524	sin: 0.999848

...

Winkel: 269	cos: -0.0174524	sin: -0.999848
Winkel: 270	cos: -1.83691e-16	sin: -1
Winkel: 271	cos: 0.0174524	sin: -0.999848

...

upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du solltest dir erst mal überlegen, welche Genauigkeit brauchst. Wenn du Probleme damit hast, daß die 17. Stelle hinter dem Komma nicht mehr genau ist, solltest du Bibliotheken verwenden, die Berechnungen mit einer höheren Genauigkeit anbieten.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Nochmal in andern Worten:
f Femto skand. femton/femten = fünfzehn (10−3)5 = 10−15 0,000.000.000.000.001 Billiardstel
a Atto skand. årton/atten = achtzehn (10−3)6 = 10−18 0,000.000.000.000.000.001 Trillionstel

Ein Trillionstel... Ist doch egal, ob er jetzt mit 0 oder damit weiter rechnet. Aber in der Ausgabe stört es, das stimmt. Aber man kann ja sagen, dass man nur die ersten 5 Nachkommastellen sehen will. Dann sollte er auf 0 runden. Das geht mit std::cout.precision ( 5 ); oder so.

http://de.wikipedia.org/wiki/Vors%C3%A4 ... Feinheiten
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

kater hat geschrieben: Aber man kann ja sagen, dass man nur die ersten 5 Nachkommastellen sehen will. Dann sollte er auf 0 runden. Das geht mit std::cout.precision ( 5 ); oder so.
n
Warum sollte er dann überhaupt runden? 0.00000000000000001 wird wenn ich nur 5 Nachkommastellen anzeige immer noch als 0.00000 angezeigt :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

ich habe es jetzt anders gelöst.

Code: Alles auswählen


static_cast<int>(variable)

aber trotzdem danke für die hilfe.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du willst nur 3 Werte bekommen und regst dich über die 17. Nachkommastelle auf? Komiker...
Antworten