2014-10-19 6 views
8

Ho una domanda circa il prezzo di sotto (N3797, 3.9.1/8):Come vengono determinati i limiti superiore e inferiore per i numeri in virgola mobile?

La rappresentazione valore di tipi a virgola mobile è definito dall'implementazione.

Per quanto mi risulta dà l'attuazione completa libertà nel definire i confini di numeri in virgola mobile. Sono specificati in template<class T> class numeric_format. Per esempio,

#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

La mia domanda è: i confini Can superiori e inferiori per il galleggiamento numeri in virgola essere arbitrariamente alto o basso, o ci sono delle restrizioni? puro C fornisce anche un insieme definito di valori di implementazione per i numeri in virgola mobile?

Sospetto che dipenda dall'architettura con cui stiamo lavorando.

+0

Avete dato uno sguardo allo standard C? (È sostanzialmente più corto di quello C++). –

+3

@OliverCharlesworth Sì, l'ho. Lo standard C definisce FLT_MAX, FLT_MIN e così via come più e meno quindi 1E37, 1E-37, nel frattempo, mentre lo standard C++ no. –

risposta

4

I limiti per i tipi integrati sono principalmente limitati dai limiti hardware. Le CPU x64 di solito usano le rappresentazioni IEEE 754 per i loro dati in virgola mobile come definiti nello standard FPA (coprocessore hardware).

Comunque come le cose vengono rappresentati internamente e trattati possono variare come annotato

La rappresentazione valore di tipi a virgola mobile è definito dall'implementazione

un compilatore di solito ha conoscenza (con particolare riferimento alle il back-end che genera il codice) del sistema di destinazione sottostante e può quindi scegliere il giusto insieme di istruzioni quando richiesto con fp-arithmetic.

È sempre possibile definire un tipo di dati personalizzato che gestisce autonomamente le risorse fisiche. Il termine a cui ti riferisci potrebbe essere Arbitrary precision arithmetic (di solito molto più lento, se i tuoi dati si adattano a ciò che l'hardware offre, dovresti farlo).

In casi particolari (ad esempio alcune unità incorporate in cui non è disponibile FPU o un'operazione di virgola mobile non può essere eseguita) potrebbe essere utilizzata l'emulazione. Questo è più economico (meno transistor) anche se più lento.

3

i limiti superiore e inferiore dipendono dall'implementazione dei numeri in virgola mobile da parte dei compilatori. Quindi non è solo un limite definito dall'utente. piuttosto è il vincolo matematico che dipende dal layout di memoria progettato dal compilatore per la memorizzazione di numeri in virgola mobile.

Se si desidera un user-defined limit è possibile utilizzare la classe intera personalizzata che sovraccarica gli operatori per operazioni numeriche e applica il limite definito dall'utente prima di qualsiasi operazione.

+5

Il compilatore, in genere, implementa il punto mobile? Nella mia esperienza, questo è tipicamente fatto dall'hardware che il compilatore ha come bersaglio? –

+1

@MatsPetersson: che dire quando non c'è hardware FP? –

+2

Penso che i compilatori possano "implementare", tuttavia la maggior parte dei compilatori sceglie di esternalizzare la macchina target. per esempio. gcc rappresenta i numeri in virgola mobile nel formato delle macchine di destinazione. Tuttavia può emulare quando cross compilato. –

2

In pianura C, è possibile #include <float.h> che fornisce costanti come:

DBL_MAX 
DBL_MIN 

FLT_MAX 
FLT_MIN 

e così come il numero di bit & cifre della mantissa è, gamma esponente, etc.

Sono sempre confuso su quale del sito di riferimento C++ sia "quello che è consentito pubblicare qui e quale è quello che non si suppone, perché si ottengono commenti", ma ecco uno trovato in google: http://www.cplusplus.com/reference/cfloat/ Poiché si tratta piuttosto di un file standard, mi aspetto comunque che non ci sia molta differenza. Naturalmente, questo si riferisce alla "C++ - versione ified", ma le macro definite sono le stesse per C.

(Si noti che il C++ limits è tipicamente implementato dalle stesse costanti che si trovano in float.h in un certo senso, direttamente o indirettamente)

+0

Sapete da soli che cpluscplus.com, cppreference.com non è normativo. Questa è la ragione per cui non posso fare affidamento sul loro. Certo, se non capisco cosa dice lo standard, cerco sempre di trovarlo in questi siti. –