Mantisse ausgeben



  • Hallo
    ich benötige ein möglichst einfaches programm,
    das mir die mantisse einer double variable,
    welche grösser gleich 1 und kleiner als 2 ist, ausgibt.

    wie kann ich das am einfachsten realisieren?

    vielen dank für eure hilfe!



  • Wo kommst du denn nicht weiter? Bei dem normalisieren der Mantisse oder beim Umwandeln in den String?



  • das problem ist eben, dass diese aufgabe mit sehr minimalem
    c++ wissen zu bewältigen sein muss (da uns erst wirkliche basics
    gelehrt wurde, und wir diese aufgabe damit lösen können sollten)

    die einschränkung von zahlen zwischen 1 und 2 hilft insofern,
    dass dann der exponent 1 eins ist in der double darstellung (oder?)

    (kenntnisse bis jetzt: kontrollstrukturen, variablen int,double und float,
    arithmetische operationen /,*,+-,%)
    irgendwie muss das so gehen...

    strings dürfen wir noch nicht verwenden...

    die ausgabe denke ich erfolgt +/- so:
    do {
    std::cout << y % 2; // gib letzte Stelle aus
    y = y / 2; // und entferne sie
    } while (y != 0);

    aber zuerst muss ich die mantisse irgendwie in eine int bringen...

    waere dankbar um jede hilfe



  • Speicher die double Variable in eine Variable, dann kannst du mit *reinterpret_cast<long*>(&d) darauf zugreifen. Auf Endianness achten, und du hast es schon.

    Oder du verwendest ein union mit einem long und einem double als member.



  • könntest du bitte etwas konkreter werden...bzw code beispiel posten?
    merci



  • #include <iostream>
    
    template <class T>
    void binaer_ausgeben(T zahl){
        void *x=&zahl;
        for(int i=sizeof(T);--i+1;std::cout<<' ')
            for(int j=8;--j+1;)
                std::cout<<(int)(( *( ((unsigned char*)x)+i )>>j)&1);
        std::cout<<std::endl;
    }
    
    int main(){
    float x=4515.863;
    double y=4711.0815;
    
    binaer_ausgeben(x);
    binaer_ausgeben(y);
    
    }
    


  • Danke der Code macht genau das was ich wollte,
    ABER er ist zu kompliziert...
    ich brauche eine lösung, welche nur die genannten elemente benötigt.
    (die schwierigkeit liegt darin..und nicht in der aufgabe selbst)

    da das programm nur für zahlen 1 <= x < 2 funktionieren muss,
    sollte es doch irgendwie möglich sein, dass ganze mit modulo (%)
    einer while schleife, multiplikation und division mit 2 usw.
    möglich sein.

    es geht nicht darum, bitweise die mantisse auszulesen,
    die gesuchte mantisse darf auch berechnet werden - auf grund
    der eingegebenen zahl.

    vielen dank



  • Steh ich jetzt aufm Schlauch?

    int mantisse(double zahl)
    {
        int zahl2=zahl;
        return zahl2==zahl?0:mantisse((zahl-(zahl2<zahl?zahl2:zahl2-1))*10)==0?(zahl-(zahl2<zahl?zahl2:zahl2-1))*10:mantisse((zahl-(zahl2<zahl?zahl2:zahl2-1))*10);
    }
    cout<<mantiss(zahl);
    

    Achne, glaube das Problem hatte ich schonmal versucht mit dem Ansatz zu lösen, klappt net... (Immer vorausgesetzt, meine Abfrag ist richtig, aber irgendwie war mir grad net nach if...)
    /edit: Wenn du die mantisse als zahl hast und sie Binär brauchst, hilft vielleicht ne union?

    template<class T,class U>
    U binaer(Loki::TypeTraits<T>::ParameterType t)
    {
        union temp
        {
            char[sizeof(T)];
            T tt;
        };
        temp.tt=t;
        U str;
        for(unsigned i=0;i<sizeof(T);++i)
        {
            str+=temp.tt[i];
        };
        return str;
    };
    


  • Danke der Code macht genau das was ich wollte,
    ABER er ist zu kompliziert...
    ich brauche eine lösung, welche nur die genannten elemente benötigt.
    (die schwierigkeit liegt darin..und nicht in der aufgabe selbst)

    da das programm nur für zahlen 1 <= x < 2 funktionieren muss,
    sollte es doch irgendwie möglich sein, dass ganze mit modulo (%)
    einer while schleife, multiplikation und division mit 2 usw.
    möglich sein.

    es geht nicht darum, bitweise die mantisse auszulesen,
    die gesuchte mantisse darf auch berechnet werden - auf grund
    der eingegebenen zahl.

    vielen dank

    Ich versteh kein Wort...
    wenn du da rumfriemeln willst bist du mit ner Union besser bedient... an sonsten läuft das alles mehr oder weniger genauso wie in dem beispielcode von mir....wenn du da irgendwelche bytes setzen oder löschen willst kannst du verunden veroderen xor usw...

    an sonsten definiert mal bitte genau was wie wo gemacht werden soll und pack am besten mal noch ein beispiel dazu so ist das ja nur ein rumgerate


Anmelden zum Antworten