Seite 1 von 1

Cosinus Funktion

Verfasst: 29. März 2010 17:42
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?

Verfasst: 29. März 2010 17:50
von kater
Der sin() von Qt will das Argument in Grad, der sin() von der Stardard Lib. in Rad.

Verfasst: 29. März 2010 17:52
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.

Verfasst: 29. März 2010 18:07
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)

Verfasst: 29. März 2010 18:18
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.

Verfasst: 29. März 2010 19:22
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

...


Verfasst: 29. März 2010 20:02
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.

Verfasst: 29. März 2010 20:11
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

Verfasst: 29. März 2010 20:24
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:

Verfasst: 29. März 2010 21:10
von anno1988
ich habe es jetzt anders gelöst.

Code: Alles auswählen


static_cast<int>(variable)

aber trotzdem danke für die hilfe.

Verfasst: 29. März 2010 22:46
von upsala
Du willst nur 3 Werte bekommen und regst dich über die 17. Nachkommastelle auf? Komiker...