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/2
    M_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/2
    M_PI) -1.83697e-16

    beachte, 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(-3
    pi/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 nachholen

    std::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(-3
    pi/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/Maschinengenauigkeit

    Gruß,
    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/2
    M_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*pi

    Daraus 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(n
    pi) 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"?


Log in to reply