cos(M_PI/2) +Grenzwerte
-
Hallo,
Ich bekomme bei meinem Kompiler die foldenden Ergebnisse für die angegebenen
winkel:
cos(M_PI/2) 6.12323e-17
cos(-M_PI/2) 6.12323e-17
cos(3/2M_PI) -1.83697e-16
cos(-3/2M_PI) -1.83697e-16
Das bedeutet:
-Wenn ich mich cos(pi/2) in positiver richtung nähere, bekomme ich +
-Wenn ich mich cos(pi/2) in negativer richtung nähere, bekomme ich -
-Wenn ich mich cos(-pi/2) in positiver richtung nähere, bekomme ich -
-Wenn ich mich cos(-pi/2) in negativer richtung nähere, bekomme ich +Ist das C++ standard oder immer so, oder ist das nur bei mir so ??
Also kurtz darf man die info verwenden.
Gruß
-
Ist eigentlich normal. Du weist schon wie der Cosinus ausschaut?
http://de.wikipedia.org/w/index.php?title=Datei:Sine_cosine_plot.svg&filetimestamp=20090930212724
-
AlexXXx schrieb:
cos(3/2M_PI) -1.83697e-16
cos(-3/2M_PI) -1.83697e-16beachte, dass 3/2=1 ist.
-
Moment mal:
cos(pi/2) ist eigentlich 0
cos(-pi/2) ist eigentlich 0
cos(3pi/2) ist eigentlich 0
cos(-3pi/2) ist eigentlich 0
Das was über bleibt ist rauschen der double->DX.
Aber es bleibbt auch noch ein Vorzeichen über. Und das Vorzeichen bleibt so über dass:
Ich rotiere den zeiger e^jx in positiver mathematischer Richtung gegen +pi/2
->+DX
Ich rotiere den zeiger e^jx in negativer mathematischer Richtung gegen +pi/2
soll heißen 0+(-3pi/2)
->-DX
Und umgekehrt.
Rein mathematisch gesehen sind alle 4 Grenzübergänge natürlich 0.
Ich würde gerne eine entscheidung treffen, die davon abhängt, ob ich mich von positiver mathematischer umlaufrichtung nähere oder von negativer.
Darf man das ??Gruß
-
Entschuldige, ich habe nicht aus dem Quelltext kopiert.
Das werde ich jetzt nachholenstd::cout <<"\n cos(M_PI/2) " << cos(M_PI/2); std::cout <<"\n cos(-M_PI/2) " << cos(-M_PI/2); std::cout <<"\n cos(3/2*M_PI) " << cos(3.0*M_PI/2); std::cout <<"\n cos(-3/2*M_PI) " << cos(-3.0*M_PI/2);
Die ergebnisse sind jene von oben.
Die werte sind vom betrag fast gleich null. Die stimmen also.
Wichtig ist nur das Vorzeichen. Ich bekomme ein Vorzeichenwechsel, je nachdem ob ich mich einem Punkt von rechts, oder von links nähere.
Gruß
-
Wenn du den cos in einer mathematischen Tabelle nachschlägst, ist klar dass du die exakten Werte erhältst. In math.cos() hast du aber keine Tabelle, sondern eine Funktion, die den cos "live" berechnet. z.B. mit ner Taylorreihe. Das Ergebnis wird nicht exakt sein, aber genau genug. Und warum jetzt das - bleibt, das schaust du dir am besten in einer Implementierung an, z.B. der des Gcc (kennt jemand die impl. in den MS-Compilern? :D)
Ansonsten hab ich hier ne Implementierung gefunden, die du sicher testen willst!
http://www.mikrocontroller.net/topic/89258#760410
-
Also Mir sind beide vorgehensweisen zum implementieren der trigonometrischen Funktionen bekannt=).
Aber das ist nicht die Frage. Die Frage ist, ob der Vorzeichenwechsel beim grenzübergang standardisiert ist von c++.
Wenn ein kompiler bei den Werten exakt 0 liefert, ist es okay, wenn er je nach dem von wo aus ich mich nähere das vorzeichen setzt oder eben nicht.
Wenn es kein C++ standard ist, aber 99% aller kompiler trotzdem das vorzeichen
in gleicher Weise setzten, Dann ist das auch okay.
Wenn das aber stark variiert, dann muß ich mir was anderes einfallen lassen.(Definition von Konvergenz bezüglich einer Folge ist ja:
Eine Folge komplexer Zahlen konvergiert gegen die komplexe Zahl , falls die
Differenzenfolge eine Nullfolge ist. Wenn man sich dazu ein Bildchen malt, sieht man, dass Re{e^jx) beim Annähern gegen PI/2 zumindest nach dieser Definition
das Vorzeichen wechseln darf, und trotzdem konvergiert.)
Aber das ist eigentlich unwichtig.Ich kann natürlich bei meinem kompiler nachschauen, was der so macht. Aber das habe ich ja schon längst getan. Ich will nur wissen, ob das immer so ist
Gruß
-
AlexXXx schrieb:
Ist das C++ standard oder immer so, oder ist das nur bei mir so ??
C++ bietet sin für float, double und long double an. Die Genauigkeit von Fließkommazahlen ist "implementierungsabhängig". Ich glaube nicht, dass für die trigonometirschen Funktionen festgeschrieben ist, wie genau sie sein sollen. Meinst Du das?
AlexXXx schrieb:
Also kurtz darf man die info verwenden.
Was genau meinst Du? Wofür benutzen? Der Wert von PI/2 ist nicht exakt mit float, double, long double repräsentierbar, das weißst Du, oder?
AlexXXx schrieb:
Moment mal:
cos(pi/2) ist eigentlich 0
cos(-pi/2) ist eigentlich 0
cos(3pi/2) ist eigentlich 0
cos(-3pi/2) ist eigentlich 0
Das was über bleibt ist rauschen der double->DX."DX"?
AlexXXx schrieb:
Aber es bleibbt auch noch ein Vorzeichen über. Und das Vorzeichen bleibt so über dass:
Ich rotiere den zeiger e^jx in positiver mathematischer Richtung gegen +pi/2
->+DX
Ich rotiere den zeiger e^jx in negativer mathematischer Richtung gegen +pi/2
soll heißen 0+(-3pi/2)
->-DX
Und umgekehrt.Du sprichst in Rätseln.
AlexXXx schrieb:
Rein mathematisch gesehen sind alle 4 Grenzübergänge natürlich 0.
Ich würde gerne eine entscheidung treffen, die davon abhängt, ob ich mich von positiver mathematischer umlaufrichtung nähere oder von negativer.
Darf man das ??Was bedeutet das denn? Wie "näherst" Du Dich denn. Was willst Du eigentlich machen?
Klingt, als könntest Du Nachhilfe in Numerik gebrauchen.
http://de.wikipedia.org/wiki/MaschinengenauigkeitGruß,
SP
-
AlexXXx schrieb:
Aber das ist nicht die Frage. Die Frage ist, ob der Vorzeichenwechsel beim grenzübergang standardisiert ist von c++.
Ich würde mich da auf nichts verlassen.
-
kasablanka schrieb:
(kennt jemand die impl. in den MS-Compilern? :D)
Ich wollte ja gerade mal nachgucken... Aber das ist so extrem frickeliger asm-code... hinzu kommt, dass ich weder in asm noch in mathe der überflieger bin;D
das hier ist jedenfalls der cos(float)-asm-code für den p4(der wahrscheinlich bei jedem intel ab dem p4 ausgeführt wird) - ich hab gar nicht gewusst, dass da schon x fkt-aufrufe davor stattfinden - hätt ich auch nicht vermutet^^_cos_pentium4: 63A97298 movlpd xmm0,qword ptr [esp+4] start: 63A9729E pextrw eax,xmm0,3 63A972A3 and ax,7FFFh 63A972A7 sub ax,3030h 63A972AB cmp ax,10C5h 63A972AF ja special (63A973F7h) 63A972B5 movlpd xmm1,qword ptr [PI32INV (639D0CE0h)] 63A972BD mulsd xmm1,xmm0 63A972C1 movlpd xmm2,qword ptr [SHIFTER (639D0CE8h)] 63A972C9 cvtsd2si edx,xmm1 63A972CD addsd xmm1,xmm2 63A972D1 movlpd xmm3,qword ptr [P_1 (639D0D00h)] 63A972D9 subsd xmm1,xmm2 63A972DD movapd xmm2,xmmword ptr [P_2 (639D0CF0h)] 63A972E5 mulsd xmm3,xmm1 63A972E9 unpcklpd xmm1,xmm1 63A972ED add edx,1C7610h ??0000: 63A972F3 movsd xmm4,xmm0 ??0001: 63A972F7 and edx,3Fh 63A972FA movapd xmm5,xmmword ptr [SC_4 (639D0CD0h)] 63A97302 lea eax,[Ctable (639D04A0h)] 63A97308 shl edx,5 63A9730B add eax,edx 63A9730D mulpd xmm2,xmm1 63A97311 subsd xmm0,xmm3 63A97315 mulsd xmm1,mmword ptr [P_3 (639D0D08h)] 63A9731D subsd xmm4,xmm3 63A97321 movlpd xmm7,qword ptr [eax+8] 63A97326 unpcklpd xmm0,xmm0 ??0002: 63A9732A movsd xmm3,xmm4 ??0003: 63A9732E subsd xmm4,xmm2 63A97332 mulpd xmm5,xmm0 63A97336 subpd xmm0,xmm2 63A9733A movapd xmm6,xmmword ptr [SC_2 (639D0CB0h)] 63A97342 mulsd xmm7,xmm4 63A97346 subsd xmm3,xmm4 63A9734A mulpd xmm5,xmm0 63A9734E mulpd xmm0,xmm0 63A97352 subsd xmm3,xmm2 63A97356 movapd xmm2,xmmword ptr [eax] 63A9735A subsd xmm1,xmm3 63A9735E movlpd xmm3,qword ptr [eax+18h] 63A97363 addsd xmm2,xmm3 63A97367 subsd xmm7,xmm2 63A9736B mulsd xmm2,xmm4 63A9736F mulpd xmm6,xmm0 63A97373 mulsd xmm3,xmm4 63A97377 mulpd xmm2,xmm0 63A9737B mulpd xmm0,xmm0 63A9737F addpd xmm5,xmmword ptr [SC_3 (639D0CC0h)] 63A97387 mulsd xmm4,mmword ptr [eax] 63A9738B addpd xmm6,xmmword ptr [SC_1 (639D0CA0h)] 63A97393 mulpd xmm5,xmm0 ??0004: 63A97397 movsd xmm0,xmm3 ??0005: 63A9739B addsd xmm3,mmword ptr [eax+8] 63A973A0 mulsd xmm1,xmm7 ??0006: 63A973A4 movsd xmm7,xmm4 ??0007: 63A973A8 addsd xmm4,xmm3 63A973AC addpd xmm6,xmm5 63A973B0 movlpd xmm5,qword ptr [eax+8] 63A973B5 subsd xmm5,xmm3 63A973B9 subsd xmm3,xmm4 63A973BD addsd xmm1,mmword ptr [eax+10h] 63A973C2 mulpd xmm6,xmm2 63A973C6 addsd xmm5,xmm0 63A973CA addsd xmm3,xmm7 63A973CE addsd xmm1,xmm5 63A973D2 addsd xmm1,xmm3 63A973D6 addsd xmm1,xmm6 63A973DA unpckhpd xmm6,xmm6 63A973DE addsd xmm1,xmm6 63A973E2 sub esp,10h 63A973E5 addsd xmm4,xmm1 63A973E9 movlpd qword ptr [esp+4],xmm4 63A973EF fld qword ptr [esp+4] 63A973F3 add esp,10h 63A973F6 ret special: 63A973F7 jg large (63A97424h) 63A973F9 pextrw eax,xmm0,3 63A973FE and ax,7FFFh 63A97402 pinsrw xmm0,eax,3 63A97407 sub esp,10h 63A9740A movlpd xmm1,qword ptr [ONE (639D0D30h)] 63A97412 subsd xmm1,xmm0 63A97416 movlpd qword ptr [esp+4],xmm1 63A9741C fld qword ptr [esp+4] 63A97420 add esp,10h 63A97423 ret large: 63A97424 jmp _cos_default (63A8CCDFh) 63A97429 lea ecx,[ecx] 63A9742C int 3 63A9742D int 3 63A9742E int 3 63A9742F int 3 fFSINH: 63A97430 mov byte ptr [ebp-90h],0FFh 63A97437 call fFEXPH (63A974D8h) 63A9743C or bl,bl 63A9743E je _rtforsnhlarge (63A974BBh) 63A97440 call ExpHypCopyInv (63A9751Bh) 63A97445 fsubp st(1),st 63A97447 jmp SinhCoshReturn (63A97497h) fFTANH: 63A97449 fld st(0) 63A9744B fabs 63A9744D fld tbyte ptr [_tanhmaxarg (63AB5160h)] 63A97453 fcompp 63A97455 wait 63A97456 fnstsw word ptr [ebp-0A0h] 63A9745C wait 63A9745D test byte ptr [ebp-9Fh],41h 63A97464 jne _rtfortnhlarge (63A974CAh) 63A97466 call fFEXPH (63A974D8h) 63A9746B or bl,bl 63A9746D je _rtfortnhlarge (63A974CAh) 63A9746F fld st(0) 63A97471 call ExpHypSum (63A97509h) 63A97476 fxch st(1) 63A97478 call ExpHypCopyInv (63A9751Bh) 63A9747D fsubp st(1),st 63A9747F fdivrp st(1),st 63A97481 ret
kannst mich ja mal aufklären^^
bb
-
@unskilled -> Kannst mich ja mal aufklären
Also wenn das Bienchen auf das Blümchen fliegt..... *lach*
Okay die Frage war nicht an mich.
@Sebastian.
Ich werd mich nicht drauf verlassen wie du sagst.
DX sollte das rauschen sein. Also genau das, was du gesagt hast.
Dann ist im komplexen konvergenz nach einer euklidischen norm definiert.
Folglich ist das Vorzeichen bei pi/2 undefiniert.Hatte gehofft, dass man sich da ein bisschen was dabei gedacht hat, und das vorzeichen an der Stelle definiert hat.
Aber egal. Wäre es definiert, würdet ihr es bestimmt wissen.
Danke für Antwort.
Gruß
-
AlexXXx schrieb:
cos(M_PI/2) 6.12323e-17
cos(-M_PI/2) 6.12323e-17
cos(3/2M_PI) -1.83697e-16
cos(-3/2M_PI) -1.83697e-16
Das bedeutet:
-Wenn ich mich cos(pi/2) in positiver richtung nähere, bekomme ich +
-Wenn ich mich cos(pi/2) in negativer richtung nähere, bekomme ich -
-Wenn ich mich cos(-pi/2) in positiver richtung nähere, bekomme ich -
-Wenn ich mich cos(-pi/2) in negativer richtung nähere, bekomme ich +Wo siehst du hier eigentlich ein "nähern"? Du berechnest nur einzelne Werte, wie willst du daraus irgendeine Aussage über Konvergenz ableiten?
Der Grund, warum du nicht jeweils 0 herausbekommst, liegt darin, dass sich π/2 nicht exakt als Fließkommazahl darstellen lässt, also M_PI/2 ungleich π/2 ist. Und der Cosinus von M_PI/2 ist halt einfach nicht 0, sondern etwas größer, was darauf schließen lässt, dass M_PI/2 etwas kleiner als π/2 ist. (Man kann davon ausgehen, dass die mathematischen Operationen so genau wie möglich sind, d.h. dass es keinen darstellbaren double-Wert gibt, der genauer als das ist, was sie zurückliefern.)
-
Dadurch dass man den cos(pi) also auch von cos(-pi) ausrechnen kann,
ist eine mathematische Umlaufrichtung zu definieren.
cos(x)=Re{e^jx}
e^jx:
^d*pi/2 für d=1+4*n n=-unendlich bis +unendlich
|
|
|
M----------->n*2PI mit n=-unendlich bis +unendlich (ganze zahlen)Konvergenz in pi/2
^----->Ein Kreis um Punkt pi/2
|
|
|
M------------>n*piDaraus folgt sign(Re{e^{j(pi/2)}}) ist bei einer komplexen konvergenten Folge
nicht definiert.Das bedeutet dass man es wählen darf.
Und das bedeutet, dass es sich zum standardisieren eignen würde.
Wie hätte ich mir das erhofft:
Da für positive n man sich eine positive Rotation des Zeigers vorstellen kann würde ich + nehmen
Da für negative n man sich eine negative Rotation des Zeigers vorstellen kann würde ich - nehmen.
Gruß
-
Würde man keine umlaufrichtung definieren wären die punkte pi/2 und -pi/2 nicht zu unterscheiden.
Das ist noch wichtig
Gruß
-
Ist das eine Antwort auf mein Posting?
-
Eine Umlaufrichtung kannst du nur haben, wenn du eine steigende oder fallende Folge an Werten in deine Formel einsetzt. Diese hast du aber nicht, wenn du nur einen Punkt ausrechnest. Die Reihe kann oszillierend um den exakten Wert konvergieren, daher ist nicht definiert, ob jetzt der positive oder negative Wert raus kommt.
Außerdem scheinst du den Fakt konsequent zu überlesen oder zu ignorieren, dass M_PI nicht exakt der Wert des tatsächlichen Pi ist, daher hast du automatisch Fehler. Von dem her kann das Vorzeichen von dieser Ungenauigkeit herrühren.Und dein Beweis ist irgendwie unverständlich. Nur weil man den Wert einer Funktion an 2 verschiedenen Punkten ausrechnen kann, heißt das noch lange nicht dass man eine Umlaufrichtung hat. Und deine Formeln ohne Erklärung sind auch -- toll.
-
Bin nicht ich der der hier fragt ?? *ggg*
Aber ja das ist die Antwort auf deine Frage.
Wäre pi so gewählt, dass eine zahl a=cos(bpi)
nicht gegen den exakten Wert a konvergieren würde (Das heißt nicht dass er ihn erreicht !! Wir brechne die reihe ja ab), wäre die Definition
von cos aufgehoben, und die Funktion wäre nicht realisiert.
Folglich ist es für die Aussage, dass cos(npi) eine konvergente folge ist unwichtig, ob wir die folge abbrechen oder pi ungenau ist.
Des weiteren frage ich mich, wiso jeder auf den Betrag aus ist.
Der betrag ist doch so oder so nur rechenfehler.Gruß
-
Die Reihe kann oszillierend um den exakten Wert konvergieren
Das ist schlich und ergreifend falsch.
Das vorzeichen darf oszillieren, aber sonst nichts.
Der Radius um den punktmuß kleiner werden. Du darfst dich auch incht auf ihm bewegen.
-
Wenn es keine Umlaufrichtugn bäbe, was wäre dann der wert von sin(-PI/2) ???
Er wäre gnau gleich dem Wert von sin(pi/2)
Damit ist bewisen dasss das Vorzeichen eine umlaufrichtung definiert.
-
AlexXXx schrieb:
Das vorzeichen darf oszillieren, aber sonst nichts.
Der Radius um den punktmuß kleiner werden. Du darfst dich auch incht auf ihm bewegen.Oszillierende Vorzeichen Das heißt Vorzeichenänderung.
Oszillieren heißt einfach, dass du einen Wert hast, um den sich eine Kurve schlängelt, mal drüber mal drunter. cos. selber oszilliert. Und das das delta (dein Radius?) kleiner wird ist ja Voraussetzung für Konvergenz, oder?AlexXXx schrieb:
Wenn es keine Umlaufrichtugn bäbe, was wäre dann der wert von sin(-PI/2) ???
Er wäre gnau gleich dem Wert von sin(pi/2)
Damit ist bewisen dasss das Vorzeichen eine umlaufrichtung definiert.Damit ist gar nix bewiesen!
f(x) = |1/x|
Wo haben wir hier einen "Umlauf"?