Hexadezimal



  • Ich möchte die binäre repräsentation eines float als uint bitfield.
    Und ehrlich gesagt, ich kenne mich nicht aus damit.
    Habt Ihr Vorschläge?



  • Ja. Du hast sogar schon welche bekommen. Nur: Fertige Lösungen gibt's hier nicht.



  • Es geht um float, das Ergebnis in dem link oben allerdings ohne bitset klasse.



  • Vergiss die floats erstmal. Kannst Du so eine Funktion schreiben, wie von Big Brother beschrieben?



  • Nein kann ich nicht.
    Ich bin mir auch nicht sicher, ob meine Frage hier richtig verstanden wurde.
    Ich habe zur Zeit folgendes

    float f = 0.5f;
    unsigned long dw = *reinterpret_cast<unsigned long*>(&f);
    std::bitset<sizeof(float)*CHAR_BIT> bits(dw);
    unsigned long ul = bits.to_ulong();
    unsigned int i = *reinterpret_cast<unsigned int*>(&ul);

    ich weiss nicht ob das Sinn macht, aber ich möchte den float wert in ein uint bitarray convertieren.
    Letztendlich möchte ich also ein uint haben und dann mit bitwise operatoren die einzelne bits zugreifen.



  • du kannst mit bitshifts und mit bitweisen operatoren auf die einzelnen bits zugreifen, dafür brauchst du kein uint array.



  • float f = 0.5;
    uint32_t = i;
    memcpy(&i,&f, sizeof(float));
    

    Bedenke das Fliesskommazahlen in einem bestimmten Format vorliegen.

    myame schrieb:

    http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec

    Ich habe mir sagen lassen, der union-Trick ist nicht standardkonform.



  • Eine weitere Funktion benutzt diese Werte für die Berechnung von Morton Key etc. Das heisst das Ergebnis muss unbedingt unsigned int sein.



  • ok hat sich erledigt, ich habe die Lösung, danke



  • Ich möchte das verstehen

    knivil schrieb:

    float f = 0.5;
    uint32_t = i;
    memcpy(&i,&f, sizeof(float));
    

    Bedenke das Fliesskommazahlen in einem bestimmten Format vorliegen.

    myame schrieb:

    http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec

    Ich habe mir sagen lassen, der union-Trick ist nicht standardkonform.

    was meinst du mit, unsigned long konvertierung, wie ich gemacht habe ist unfug oder?



  • Fließkommazahlen werden in Mantisse und Charakteristik gespeichert.

    Zudem glaube ich ist die Einteilung wieviel Bit Mantisse und Charakteristik und die Anordnung(Bigendian/Littleendian) nicht einheitlich.



  • Ja, danke. Was ich gemacht habe ist absolut unfug natürlich.
    Es ging eher darum, dass ich float werte (koordinaten) als binäre form haben sollte, als uint.

    So:
    float fx = 0.5, fy = 0.5, fz = 0.5;

    // Convert to fixed point number.
    unsigned int x = (unsigned int) (fx * 0x400);
    unsigned int y = (unsigned int) (fy * 0x400);
    unsigned int z = (unsigned int) (fz * 0x400);

    //Actually create morton key.
    x = (x | (x<<16)) & 0xff0000ff;
    x = (x | (x<< 8)) & 0x0300f00f;
    x = (x | (x<< 4)) & 0x030c30c3;
    x = (x | (x<< 2)) & 0x09249249;

    y = (y | (y<<16)) & 0xff0000ff;
    y = (y | (y<< 8)) & 0x0300f00f;
    y = (y | (y<< 4)) & 0x030c30c3;
    y = (y | (y<< 2)) & 0x09249249;

    z = (z | (z<<16)) & 0xff0000ff;
    z = (z | (z<< 8)) & 0x0300f00f;
    z = (z | (z<< 4)) & 0x030c30c3;
    z = (z | (z<< 2)) & 0x09249249;

    // Add sentinel bit and combine key.
    unsigned int key =(1<<30) + (z<<2) + (y<<1) + x;

    Ich verstehe diesen code aber nicht. Wie wird hier convertiert?
    Und was ist ein sentinel?
    Wie man sieht, ich kenne mich damit nicht aus. Kann das jemand klären
    oder wo kann ich das nachlesen?



  • myame schrieb:

    Ich verstehe diesen code aber nicht. Wie wird hier convertiert?

    Wenn du die Cast's hier meinst, die haben nichts mit der Binärdarstellung zu tun, sondern sind eine direkte wertmäßige Umrechnung (die unsigned-Variablen bekommen den float-Wert, wobei Nachkommastellen abgeschnitten werden).
    Was der Sinn hinter den Berechnungen ist, mußt du den fragen, der dir diesen Code geliefert hat.

    PS: Übrigens ist alles, womit der PC arbeitet, in "binärer Form" 😉 (der Rest ist eine Frage der Werte-Interpretation)



  • Man könnte sich zum Spaß die Gleitkommafunktion selber machen. Wie werden FPU-Simulatoren geschrieben?

    Wiki: z.B. http://de.wikipedia.org/wiki/IEEE_754

    aber von Hand:

    Z.B. Eine Stelle nach dem Komma:
    1. Zahl einlesen. ->A,A
    2. Komma verschieben. ->AA // *10
    3. Rechnen
    4. Bei Ausgabe Komma zurück verschieben bzw. schon passend in den Speicher schreiben und später ausgeben.
    ...
    A. Taschenrechner verachten
    B. http://midp-calc.sourceforge.net/Calc.html ausprobieren
    C. Javapower aufm Handy bestaunen


Anmelden zum Antworten