wake-up-neo.com

Gleitkommatypen mit fester Größe

In dem stdint.h (C99), boost/cstdint.hpp und cstdint (C++ 0x) -Header gibt es unter anderem vom Typ int32_t.

Gibt es ähnliche Gleitkommatypen mit fester Größe? Etwas wie float32_t?

79
Pietro

In den C- oder C++ - Standards existiert derzeit nichts dergleichen. Tatsächlich gibt es nicht einmal die Garantie, dass float überhaupt ein binäres Gleitkommaformat ist.

Einige Compiler garantieren, dass der Typ float das 32-Bit-Binärformat IEEE-754 hat. Manche nicht. In Wirklichkeit ist float tatsächlich der Typ IEEE-754 single auf den meisten nicht eingebetteten Plattformen, obwohl die üblichen Vorbehalte gegen einige Compiler bestehen, die Ausdrücke in einem breiteren Format auswerten anwenden.

Es gibt eine Arbeitsgruppe, die sich mit dem Hinzufügen von C-Sprachbindungen für die Revision von IEEE-754 aus dem Jahr 2008 befasst. Wenn dies zu C hinzugefügt würde, würde der C++ - Standard wahrscheinlich nachziehen ... irgendwann.

42
Stephen Canon

Wenn Sie wissen möchten, ob Ihr float der IEEE-32-Bit-Typ ist, aktivieren Sie std::numeric_limits<float>::is_iec559. Es ist eine Konstante zur Kompilierungszeit, keine Funktion.

Wenn Sie kugelsicherer sein möchten, überprüfen Sie auch std::numeric_limits<float>::digits, Um sicherzustellen, dass die IEEE-Standard-Doppelgenauigkeit für float nicht verwendet wird. Es sollte 24 sein.

Wenn es um long double Geht, ist es wichtiger, digits zu überprüfen, da es ein paar IEEE-Formate gibt, die vernünftigerweise sein könnten: 128 Bit (Ziffern = 113) oder 80 Bit (Ziffern = 64) .

Es wäre nicht praktisch, float32_t Als solches zu haben, da Sie normalerweise, falls verfügbar, Gleitkommahardware verwenden und nicht auf eine Softwareimplementierung zurückgreifen möchten.

28
Potatoswatter

Wenn Sie der Meinung sind, dass typedefs wie float32_t und float64_t aus irgendwelchen Gründen unpraktisch sind, müssen Sie sich an Ihr bekanntes Betriebssystem, den Compiler, gewöhnt haben, dass Sie nicht zu weit außerhalb Ihres Nestes schauen können.

Es gibt Hardware, die nativ 32-Bit-IEEE-Gleitkommaoperationen ausführt, und andere, die 64-Bit ausführen. Manchmal müssen solche Systeme sogar miteinander sprechen. In diesem Fall ist es äußerst wichtig zu wissen, ob ein Double auf jeder Plattform 32 Bit oder 64 Bit ist. Wenn die 32-Bit-Plattform auf der Grundlage der 64-Bit-Werte der anderen Plattform übermäßige Berechnungen durchführen sollte, sollten Sie je nach Timing- und Geschwindigkeitsanforderungen möglicherweise auf die niedrigere Genauigkeit umwandeln.

Ich persönlich fühle mich unwohl, wenn ich Floats und Doubles benutze, es sei denn, ich weiß genau, wie viele Bits sich auf meiner Platte befinden. Umso mehr, wenn ich diese über einen Kommunikationskanal auf eine andere Plattform übertragen möchte.

15
EmbeddedCoder

Derzeit wird vorgeschlagen, der Sprache die folgenden Typen hinzuzufügen:

decimal32
decimal64
decimal128

die eines Tages zugänglich sein kann durch #include <decimal>.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

3
Trevor Hickey