2016-11-03 6 views
0

Ich erstelle eine digitale C++ - Signalanwendung, die die Genauigkeit oder Größe der Operanden zur Laufzeit benötigt.Definieren der Genauigkeit/Größe eines Double oder Float zur Laufzeit

Ich bin mir bewusst, dass in der Regel, double und float Typen eine minimale Länge von IEEE 754-Standard garantiert werden, aber wie bei int Typen, das sind nur Mindestlängen.

Welche Optionen sind verfügbar, um Fließkommatypen mit anpassbarer Länge zu definieren, die zur Laufzeit definiert werden? Im Idealfall wäre eine vorhandene Bibliothek oder ein Typ, meine andere grobe Idee wäre jedoch, eine Bitmaske zu verwenden, um nach jeder Operation die letzten n Bits einer Zahl zu entfernen.

+1

Ich vermute, dass Sie etwas falsch verstanden haben. Es gibt keine allgemeine Möglichkeit, die Größe von Gleitkommaoperanden zur Laufzeit festzulegen. Das Maskieren von zusätzlichen Bits, wie Sie es vorgeschlagen haben, wird die Dinge schrecklich langsam machen, was in der digitalen Signalverarbeitung ein Gräuel ist. –

+0

Verwenden Sie 'int' mit Zähler und Denumerator? – Jarod42

+1

IEEE 754 definiert mehrere * genaue * Größen. Sie suchen nach einer externen Bibliothek, die nicht zum Thema gehört. – EJP

Antwort

0

Haben Sie darüber nachgedacht, union zu verwenden?

union S 
{ 
    std::int32_t n;  // occupies 4 bytes 
    std::uint16_t s[2]; // occupies 4 bytes 
    std::uint8_t c;  // occupies 1 byte 
}; 

Da es Menschen, die nicht auf die Webseite gehen kann zitiert, versuchen Sie das Beispiel:

Union S 
{ 
    Double H; 
    float L; 
}; 

Sie den gleichen Raum verwenden, sondern den entsprechenden Wert auf der Variablen zugewiesen wird benötigt .

+0

Ähm, die Frage ist über ** Fließkomma ** -Typen. –

0

Haben Sie "Bitfelder" berücksichtigt? es funktioniert jedoch für ganzzahlige Typen. oder kann, können Sie etwas maßgeschneidert machen, indem Sie den Dezimaltyp in einem Teil und einem integralen Teil in zwei verschiedenen Variablen in der Struktur speichern und ihre Bitfelder setzen. Etwas wie ...

struct Number{ 
int integral:4; 
int decimal:6; 
}; 
Verwandte Themen