Wie werden die oberen und unteren Grenzen für Fließkommazahlen bestimmt?

8

Ich habe eine Frage zu dem folgenden Zitat (N3797, 3.9.1 / 8):

  

Die Wertdarstellung von Fließkommatypen ist implementierungsdefiniert.

Soweit ich es verstehe, gibt es der Implementierung völlige Freiheit beim Definieren der Grenzen von Gleitkommazahlen . Sie sind in template<class T> class numeric_format angegeben. Zum Beispiel,

%Vor%

DEMO

Meine Frage ist: Können obere und untere Grenzen für Fließkommazahlen beliebig hoch oder niedrig sein, oder gibt es Einschränkungen? Bietet reines C auch eine implementierungsdefinierte Menge von Werten für Fließkommazahlen?

Ich vermute, das hängt von der Architektur ab, mit der wir arbeiten.

    
jogojapan 19.10.2014, 08:10
quelle

3 Antworten

4

Die Grenzen für integrierte Typen werden meist durch die Hardwaregrenzen eingeschränkt. x64-CPUs verwenden normalerweise IEEE 754 Darstellungen für ihre Fließkommadaten, wie im FPA-Standard (Hardware-Coprozessor) definiert.

>

Wie auch immer die Dinge intern dargestellt und gehandhabt werden, kann variieren, wie Sie festgestellt haben

  

Die Wertdarstellung von Fließkommatypen ist implementierungsdefiniert

Ein Compiler verfügt normalerweise über Kenntnisse (insbesondere über das Backend, das die Codegenerierung durchführt) des zugrundeliegenden Zielsystems und kann daher bei Aufforderung mit fp-arithmetic die richtigen Anweisungen wählen.

Sie können immer einen benutzerdefinierten Datentyp definieren, der physische Ressourcen selbst verwaltet. Der Begriff, auf den Sie sich beziehen, könnte Arbitrary arithmetic sein (normalerweise wesentlich langsamer, wenn Ihre Daten in die Hardware passen Angebote, sollten Sie dafür gehen).

In bestimmten Fällen (z. B. bei einigen eingebetteten Einheiten, bei denen keine FPU verfügbar ist oder eine Gleitkommaoperation nicht ausgeführt werden kann), könnte eine Emulation verwendet werden. Dies ist billiger (weniger Transistoren), obwohl langsamer.

    
Marco A. 19.10.2014, 09:04
quelle
3

obere und untere Grenzen hängen von der Implementierung von Gleitkommazahlen durch Compiler ab. Es ist also nicht nur ein benutzerdefiniertes Limit. es ist vielmehr die mathematische Einschränkung, die von dem Speicherlayout abhängt, wie es vom Compiler zum Speichern von Gleitkommazahlen entworfen wurde.

Wenn Sie user-defined limit verwenden möchten, können Sie Ihre eigene Integer-Klasse verwenden, die Operatoren für numerische Operationen überlädt und Ihre benutzerdefinierte Grenze vor jeder Operation anwendet.

    
Neel Basu 19.10.2014 08:44
quelle
2

In Ebene C können Sie #include <float.h> angeben, das Konstanten wie folgt bereitstellt:

%Vor%

und wie viele Bits & amp; Ziffern die Mantisse ist, Exponent Bereich, etc.

Ich bin immer verwirrt darüber, welche der C ++ - Referenzseiten die ist, "die du hier posten darfst und welche du nicht sollst, weil du Kommentare darüber bekommst", aber hier ist eine in Google: Ссылка Da dies eher eine Standarddatei ist, erwarte ich, dass es sowieso keinen so großen Unterschied gibt. Dies bezieht sich natürlich auf die "C ++ - Version", aber die definierten Makros sind für C gleich.

(Beachten Sie, dass das C ++ limits normalerweise von denselben Konstanten implementiert wird, die in float.h in gewisser Hinsicht direkt oder indirekt gefunden werden)

    
Mats Petersson 19.10.2014 09:10
quelle

Tags und Links