Überlauf bei double ?



  • ich bekomme aber bei einem long-wert von 116523
    einen double-wert von -14.55....... !?

    siehe codezeile oben...



  • nene..... moment mal.... GetValS holt mir lediglich einen wert....

    double s = ((double) ptpol.GetValS()) / ptpol.NachKomma() ;
    

    und GetValS() ist

    long CPoint3DPolar::GetValS ( void ) { return m_s ;} ;
    


  • x-coder44 schrieb:

    ich bekomme aber bei einem long-wert von 116523
    einen double-wert von -14.55....... !?

    siehe codezeile oben...

    Bist du dir sicher, daß du nicht vergessen hast, den Wert zu initialisieren? Da solltest du lieber nachsehen, was WIRKLICH zurückgegeben wurde.



  • war nur ein vorschlag
    was ich grad seh
    du castet den wert {immernoch C - grr} auf double und dann / nachkomma ?
    da liegt evtl das problem

    probier das mal:

    // vorher
    double s = ((double) ptpol.GetValS()) / ptpol.NachKomma() ;
    
    // nachher
    double dNewValue = static_cast<double>(ptpol.GetValS() / ptpol.NachKomma());
    

    stichwort: "C++ statt C" sowie "Ungarische Notation"

    und mit dem debugger die variablen verfolgt hast du anscheinend auch nicht (zb das du den long erstmal nur so holst und anschaust was da kommt bevor du was castest)



  • bei deinem code fallen bei mir auch noch die nachkommastellen weg....
    wo könnt denn da der fehler liegen ?

    das mit dem "ersteinmal nicht casten und schauen was passiert" mach ich mal...



  • aber vorher - schau doch erstmal per debugger nach was du von der funktion zurueck bekommst, dann was passiert wenn du es / nachkomma teilst, und dann schau was nach dem cast los ist
    drauf rumprobieren {try & error} hilft nur im augenblick, aber bring meist keine erkenntnis

    darum
    debugger an und schaun
    los #schick #gg



  • hab was interessantes gefunden:

    bei meinem geänderten code:

    long s = ptpol.GetValS();
    

    ergab sich das hier...

    Name Wert Typ
    ---- ---- ---
    s -14550 __int32

    es handelt sich doch hier um einen überlauf, oder?



  • Wo hast du denn einen Wert in deine long-Variable reingepackt?



  • also ich habe eine membervariable einer klasse m_s und benutze Bitfelder...

    class CPoint3DPolar
    {
    private:
    // Die Parameter
    unsigned long	m_a :22;		//22 Bit a ( Winkel: Alpha )
    unsigned long	m_b :22;		//22 Bit b ( Winkel: Beta  )
    long			m_s :17;	//17 Bit S ( Entfernung    )
    ... ... ...
    

    der errechnete wert von m_s = 116523 wird richtig gespeichert...

    im Arbeitsspeicher:
    0x0012F05C 2a c7 0b (wird aber dank des feldes als 1C7A2 erkannt)

    mit meiner methode:
    [/cpp]long CPoint3DPolar::GetValS ( void ) { return m_s ;} ;

    rufe ich in der anderen klasse diese variable auf, da sich ja beide klassen kennen...
    
    in meiner anderen klasse dann erfolgt der aufruf der mehtode:
    

    long s = ptpol.GetValS();[cpp]

    nun sehe ich zur meiner schande im arbeitsspeicher für long s:
    0x0012F014 2a c7 ff ff

    der liest also alle vier byte aus... ohoh

    aber warum klappt es dann bei kleineren werten ?



  • Das höchstwertige Bit bei deinem Bitfeld (in deinem Beispiel ist das Bit 16) ist das Vorzeichen - und dein 116523 ist 0x1C72B und das ist ein negativer Wert.

    (sprich: Ja, du hast einen Überlauf - allerdings nicht im double, sondern in deinem Bitfeld)


Anmelden zum Antworten