2014-10-19 16 views
8

Ich habe eine Frage über das Zitat unten (N3797, 3.9.1/8):Wie werden die oberen und unteren Grenzen für Fließkommazahlen bestimmt?

Der Wert Darstellung Gleitkommatypen ist implementierungsdefiniert ist.

Soweit ich verstehe, es gibt die Umsetzung völlige Freiheit Grenzen Gleitkommazahlen bei der Definition. Sie sind in template<class T> class numeric_format angegeben. Zum Beispiel

#include <iostream> 
#include <limits> 

int main() 
{ 
    std::cout << "double_max = " << std::numeric_limits<double>().max() << std::endl; 
    std::cout << "double_min = " << std::numeric_limits<double>().min() << std::endl; 
    std::cout << "float_max = " << std::numeric_limits<float>().max() << std::endl; 
    std::cout << "float_min = " << std::numeric_limits<float>().min() << std::endl; 
} 

DEMO

Meine Frage ist: Kann man obere und untere Grenze für sein Gleitkommazahlen beliebig hoch oder niedrig ist, oder gibt es Einschränkungen? Bietet pure C auch eine Implementierung definierte Menge von Werten für Fließkommazahlen?

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

+0

Haben Sie sich den C-Standard angesehen? (Es ist wesentlich kürzer als das C++.) –

+3

@OliverCharlesworth Ja, habe ich. Der C-Standard definiert FLT_MAX, FLT_MIN usw. als mehr als und weniger als 1E37, 1E-37 entsprechend, während der C++ Standard dies nicht tut. –

Antwort

4

Die Grenzwerte für integrierte Typen sind meist durch die Hardware-Grenzwerte begrenzt. x64-CPUs verwenden normalerweise IEEE 754 Darstellungen für ihre Fließkommadaten, wie im FPA-Standard (Hardware-Coprozessor) definiert.

Wie dem auch sei, wie die Dinge intern dargestellt und gehandhabt werden kann variieren, wie Sie

bemerkt

Der Wert Darstellung Gleitkommatypen ist die Implementierung definiert

ein Compiler in der Regel Wissen hat (vor allem mit Bezug auf das Back-End, das die Code-Generierung durchführt) des zugrunde liegenden Zielsystems und kann daher bei Aufforderung mit fp-arithmetic die richtige Menge von Anweisungen auswählen.

Sie können immer einen benutzerdefinierten Datentyp definieren, der die physischen Ressourcen selbst verwaltet. Der Begriff, den Sie beziehen, könnte Arbitrary precision arithmetic sein (normalerweise erheblich langsamer, wenn Ihre Daten in das hineinpassen, was die Hardware anbietet, 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.

3

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

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

+5

Implementiert der Compiler in der Regel Fließkomma? Meiner Erfahrung nach wird das normalerweise von der Hardware ausgeführt, auf die der Compiler abzielt? –

+1

@MatsPetersson: Was ist, wenn es keine FP-Hardware gibt? –

+2

Ich denke, Compiler 'können' implementieren, jedoch die meisten Compiler wählen auslagern Zielmaschine. z.B. gcc steht für Fließkommazahlen im Format der Zielmaschinen. Es kann jedoch emulieren, wenn Kreuz kompiliert wird. –

2

Im Klar C, können Sie #include <float.h> die Konstanten wie bestimmt:

DBL_MAX 
DBL_MIN 

FLT_MAX 
FLT_MIN 

und sowie wie viele Bits & Ziffern der Mantisse, Exponent Bereich usw.

Ich bin immer verwirrt darüber, welche der C++ - Referenz-Site ist die "die Sie hier veröffentlichen dürfen und die ist, die Sie nicht sollen, weil Sie Kommentare darüber erhalten", aber hier ist eine gefunden in google: http://www.cplusplus.com/reference/cfloat/ Da dies eher eine Standarddatei ist, erwarte ich, dass es nicht so viel Unterschied gibt. Natürlich ist dies auf den „C++ - ified Version“ bezeichnet, aber die definierten Makros sind für C.

(Beachten Sie, dass die C++ limits typischerweise aus den gleichen Konstanten implementiert wird, die in float.h in gewissem Sinne zu finden ist, direkt oder indirekt)

+0

Sie wissen selbst, dass cpluscplus.com, cppreference.com nicht normativ sind. Deshalb kann ich mich nicht auf ihre verlassen. Natürlich, wenn ich nicht verstehe, was der Standard sagt, versuche ich immer, es in diesen Seiten zu finden. –

Verwandte Themen