In den Headern stdint.h
(C99), boost / cstdint.hpp und cstdint
(C ++ 0x) gibt es unter anderem den Typ int32_t
.
Gibt es ähnliche Gleitkommatypen mit fester Größe? So etwas wie float32_t
?
c++
c
boost
floating-point
Pietro
quelle
quelle
sizeof
Operator. Ein Typ wie dieser wäre nützlich, wenn ein Algorithmus eine bekannte spezifische Größe erfordert.sizeof
das Problem des konsistenten Marshalling und Unmarshalling von schwimmenden Typen gelöst werden?Antworten:
In den C- oder C ++ - Standards gibt es derzeit nichts Vergleichbares. Tatsächlich gibt es nicht einmal eine Garantie dafür, dass
float
es sich überhaupt um ein binäres Gleitkommaformat handelt.Einige Compiler garantieren, dass der
float
Typ das 32-Bit-Binärformat IEEE-754 ist. Einige nicht. In Wirklichkeitfloat
handelt es sich tatsächlich um densingle
Typ IEEE-754 auf den meisten nicht eingebetteten Plattformen, obwohl die üblichen Einschränkungen bei einigen Compilern gelten, die Ausdrücke in einem breiteren Format bewerten.Es gibt eine Arbeitsgruppe, die das Hinzufügen von C-Sprachbindungen für die Revision von IEEE-754 von 2008 erörtert. Sie könnte in Betracht ziehen, die Hinzufügung eines solchen Typedef zu empfehlen. Wenn dies zu C hinzugefügt würde, würde der C ++ - Standard wahrscheinlich nachziehen ... irgendwann.
quelle
Wenn Sie wissen möchten, ob
float
es sich um den IEEE 32-Bit-Typ handelt, überprüfen Siestd::numeric_limits<float>::is_iec559
. Es ist eine Konstante zur Kompilierungszeit, keine Funktion.Wenn Sie kugelsicherer sein möchten,
std::numeric_limits<float>::digits
stellen Sie außerdem sicher, dass sie nicht den IEEE-Standard mit doppelter Genauigkeit für verwendenfloat
. Es sollte 24 sein.Wenn es darum geht,
long double
ist es wichtiger zu überprüfen,digits
da es einige IEEE-Formate gibt, die vernünftigerweise sein könnten: 128 Bit (Ziffern = 113) oder 80 Bit (Ziffern = 64).Es wäre nicht praktisch, dies
float32_t
zu tun, da Sie normalerweise Gleitkomma-Hardware verwenden möchten, sofern verfügbar, und nicht auf eine Software-Implementierung zurückgreifen möchten.quelle
long double
Format unter OS X (sowohl 32-Bit- als auch 64-Bit-Intel) ist genau das doppelt erweiterte IEEE-754-Format, das in Little-Endian-Reihenfolge gespeichert ist. Daran ist überhaupt nichts Ungewöhnliches. Die Bytes 0-7 enthalten das Signifikantenfeld und die Bytes 8 und 9 enthalten die Exponenten- und Vorzeichenfelder.5.0L
ein Signifikand vona000000000000000
. Sein unverzerrter Exponent ist +2 und die doppelt erweiterte Exponentenvorspannung ist3fff
, so dass der vorgespannte Exponent für 5,0 l ist4001
. Das tatsächliche Bytemuster, wenn es in Little-Endian-Reihenfolge gespeichert wird00 00 00 00 00 00 00 a0 01 40
, ist , und wenn Sie dies als zwei Little-Endian-64-Bit-Ganzzahlen betrachten, sehen Sie genau, was Sie beobachtet haben.4001
in Little-Endian01 40 00 00 ...
Wenn nichts anderes steht, steht das niedrigstwertige Byte an erster Stelle. Ich erwarte, dass die Sequenza0 01 40
irgendwo in der Zahl erscheint (wenn sie nur eine Rotation durchgeführt haben), aber ich glaube nicht, dass Sie erklärt haben, waruma0
und01 40
in völlig getrennten Hälften sind.Wenn Sie der Meinung sind, dass Typedefs wie float32_t und float64_t aus irgendeinem Grund unpraktisch sind, müssen Sie sich zu sehr an Ihr bekanntes Betriebssystem, den Compiler, gewöhnt haben, um nicht außerhalb Ihres kleinen Nestes schauen zu 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 kommunizieren. 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 übermäßige Berechnungen auf der Basis der 64-Bit-Werte der anderen Plattform durchführen würde, möchten wir je nach Timing- und Geschwindigkeitsanforderungen möglicherweise eine geringere Genauigkeit erzielen.
Ich persönlich fühle mich unwohl mit Floats und Doubles, es sei denn, ich weiß genau, wie viele Bits sich auf meiner Plattform befinden. Umso mehr, wenn ich diese über einen Kommunikationskanal auf eine andere Plattform übertragen möchte.
quelle
Derzeit wird vorgeschlagen, die folgenden Typen in die Sprache aufzunehmen:
die eines Tages zugänglich sein kann durch
#include <decimal>
.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
quelle