sin(pi) ist nicht gleich 0! wie muss ich pi definieren?
-
-
mir ist schon klar (
), dass ich keine 100% genauen Wurzelberechnungen hinkriegen kann. Die Frage ist nur: Wie sin(pi) normiert? Die Implementierung aus cmath.h muss doch wohl zulassen dass sin(pi) = 0 ist bzw sin(~pi). Die muss doch so auf irgendeinen Wert geeicht sein der ungefähr pi ist. Was ich wissen muss ist ledliglich: Welche Zahl a erfüllt sin(a) = 0 (außer 0
) ?
-
Alle Vielfachen von Pi?
#define _USE_MATH_DEFINES #include <math.h> #include <stdio.h> int main() { int i = 0; while (i < 1000) printf("%f\n", sin(i++*M_PI)); return 0; }
-
chris, akzeptiere doch einfach, dass der computer nicht exakt bis zur letzten stelle rechnen kann, wenn du schon nicht verstehen willst, wie floats funktionieren.
-
ja danke für eure bemühungen aber ich verstehe nicht wieso die sin() funktion nicht wenigstens auf einen pseudo-wert für pi geeicht ist. sin(M_PI) ist nämlich auch nicht 0. das ist doch echt doof, oder?
danke für den float-artikel nebenbei
hat mir zwar bei dieser sache nichts geholfen, war aber interessant
danke
chris90
-
Das Problem hast Du immer, wenn Du mit floats rechnest. sin() ist also die Regel, nicht die Ausnahme.
-
chris90 schrieb:
ich verstehe nicht wieso die sin() funktion nicht wenigstens auf einen pseudo-wert für pi geeicht ist. sin(M_PI) ist nämlich auch nicht 0. das ist doch echt doof, oder?
Nein, doof wäre es, wenn sich die Funktion für eine sehr große Anzahl bestimmter, magischer float- Werte anders verhalten würde - denn konsequenterweise müsste sin dann auch für alle Vielfache von Pi (genauer: für alle nächstliegenden float-Werte) genau Null liefern. Die Prüfung, ob das Argument ein Vielfaches von Pi ist, ist mit Fließkommatypen wegen der eingebauten Ungenauigkeit nicht machbar, außer vielleicht mit einer riesigen Lookup-Tabelle. So oder so würde die Funktion dadurch viel langsamer werden.
Und was ist, wenn du nicht genau Pi hast, sondern diesen Wert, der genau in einen float passt? Dafür liefert deine sin-Version dann falsche Werte. Ganz toll.
danke für den float-artikel nebenbei
hat mir zwar bei dieser sache nichts geholfen, war aber interessant
Er sollte dir nicht helfen, sondern klarmachen, dass das Problem nicht bei der sin-Funktion, sondern bei den Eigenschaften der Fließkommadatentypen liegt.
-
Es ist halt schon extrem blöd wenn ich (ich verwende übrigens long double und nicht nicht float) den vektor (1|0) um 90 Grad drehe und dann statt (0|1) irgendwas wie (2*10^-16 | 1) bekomme. Ich nehme an dass das ein ziemliches Problem werden könnte unter umständen...
-
sin() hat intern die Genauigkeit double und nicht long double (dafür ist sinl).
Des weiteren mußt Du halt, wenn Du wirklich 0 haben willst (welche Probleme erwartest Du, btw?), in den sauren Apfel beißen und alles <10^-15 (oder so) auf 0 setzen, oder eine eigene Sinus-Funktion definieren, die deine gewünschte Genauigkeit mit den gewünschten Randbedingungen hat.
-
Ds Problem lässt sich egtl bedingt lösen indem du einfach einen Fehler eingestehst. Dann sagst du einfach wenn sin(pi) kleiner als 10^-14 ist soll er 0 draus machen, anders wird sich dieses problem wohl nie lösen lassen