IEEE float/double Endianness?, Network-order?



  • Hallo,
    gibt's bei IEEE floats/doubles eigentlich auch die Endian-Problematik?
    D.h. wie liegt z.B. ein float auf x86 Architekturen im Speicher?
    Kommt da das Byte mit dem Vorzeichen drin als erstes (=an niedrigerer Adresse) oder als letztes (=an höherer Adresse)?
    Kann es da allgemein unterschiedliche Architekturen geben?

    Spielt ja dann wieder eine Rolle wenn man diese Typen übers Netzwerk mit potentiell unterschiedlichen Architekturen austauscht.
    Bloß hab ich die Funktionen ntohf/htonf bzw. ntohd/htond noch nirgendwo gesehen 😉
    Also wie läuft das?



  • ieee schreibt nur vor, wie ein float (und seine diversen derivate) auszusehen hat, welche bits für was zuständig sind etc. wie diese bits im system verwaltet werden, ist entscheidungssache des hardwareherstellers. also ja, es gibt die "endian problematik" auch bei ieee floats.



  • weiss jemand wie es auf x86 aussieht und ob es Funktionen zur Konvertierung zu Network-order gibt?



  • Kann man nicht einfach 2 mal die Konvertierungsfunktion für long aufrufen? (wenn sizeof(float) == sizeof(long) * 2 ist)



  • So eine Funktion hat man doch ruckzuck selbst geschrieben

    ungefähr so

    template<typename T>
    T swap_endianess(T o) {
      typedef char byte_t;
    
      byte_t *ptr = reinterpret_cast<byte_t*>(&o);
    
      for(std::size_t i = 0; i < sizeof(o)/2; ++i) {
        byte_t t = ptr[i];
        ptr[i] = ptr[sizeof(o) - i - 1];
        ptr[sizeof(o) - i - 1] = t;
      }
    
      return *reinterpret_cast<T*>(ptr);
    }
    


  • Das is aber nich das Problem kingruedi.
    htonl ist zwischen unterschiedlichen Endianess-Architekturen portabel, dein swap_endianess<long> aber nicht!

    Und ich weiss immer noch nicht wie die IEEEs auf x86 gespeichert sind.
    🙄



  • x86 ist Little Endian, daher werden die Fließkommazahlen wohl auch so gespeichert 🙄

    Für floats gibt es keine byteorder Funktionen, da diese nicht in den normalen Netzwerkheadern vorkommen.

    Die Funktion ist portabel, du musst eben nur wissen wann du byte swappen musst oder nicht. Das kannst du ja per #ifdef kontrollieren.

    Warum willst du unbedingt Binärdaten verschicken? Afaik sind float und double je nach Platform unterschiedlich groß.



  • x86 ist Little Endian, daher werden die Fließkommazahlen wohl auch so gespeichert 🙄

    Darauf würde ich nicht so ohne weiteres schließen.
    floats/doubles waren für den Prozessor historisch gesehen im Gegensatz zu ints opake Datenstrukturen. Die eine Architekturentscheidung (CPU) muss mit der anderen (FPU) nichts zu tun haben. Und IEEE 754 definiert floats/doubles bitweise, weshalb ich keinen Grund für eine spezielle Endianess sehe.
    Aber das muss ich wohl selbst mal mit einem kleinen C-Programm checken, wenn ich die Zeit hab. Dachte nur einer wüßte's vielleciht.

    Für floats gibt es keine byteorder Funktionen, da diese nicht in den normalen Netzwerkheadern vorkommen.

    Schon klar, aber es wird sich ja hoffentlich jemand mal Gedanken darüber gemacht wie die denn auszutauschen wären, gegebenenfalls.
    (Und es haben sich natürlich schon Leute Gedanken gemacht: http://www.faqs.org/rfcs/rfc1014.html)

    Die Funktion ist portabel, du musst eben nur wissen wann du byte swappen musst oder nicht. Das kannst du ja per #ifdef kontrollieren.

    Mit anderen Worten: Gefrickel! Bäh! *hust* 😃 😉

    Warum willst du unbedingt Binärdaten verschicken? Afaik sind float und double je nach Platform unterschiedlich groß.

    Deshalb will ich IEEE 754 floats und doubles verschicken.
    Die sind nämlich klar definiert:
    http://steve.hollasch.net/cgindex/coding/ieeefloat.html

    Und auf den allermeisten Platformen entspricht sich das auch in C und C++:
    http://en.wikipedia.org/wiki/IEEE_floating-point_standard


Log in to reply