2011-12-27 11 views
16

La domanda riguarda la modellazione di infinito in C++ per il tipo di dati double. Ne ho bisogno in un file di intestazione, quindi non possiamo usare funzioni come numeric_limits.Infinito di modellazione per il doppio valore maggiore

C'è una costante definita che rappresenta il valore più grande?

risposta

24

numeri in virgola mobile (come i doppi) possono effettivamente contenere infinito positivo e negativo. La costante INFINITY dovrebbe essere nell'intestazione di math.h.

fatto immersioni standard trovato il testo:

4 L'INFINITY macro restituisce un'espressione costante di tipo float rappresenta l'infinito positivo o senza segno, se disponibili; a una costante positiva di tipo float che fuoriesce al momento della traduzione.

Nella sezione 7.12 Mathematics <math.h>


Poi, naturalmente, si ha la funzione di supporto isinf per verificare l'infinito (che è anche in math.h).

7.12.3.3 Il isinf macro

int isinf (x real-flottante);

Descrizione: la macro isinf determina se il valore dell'argomento è infinito (positivo o negativo). Innanzitutto, un argomento rappresentato in un formato più largo di il suo tipo semantico viene convertito nel suo tipo semantico. Quindi la determinazione di si basa sul tipo dell'argomento.

Restituzioni: la macro isinf restituisce un valore diverso da zero se e solo se il suo argomento ha un valore infinito .

+1

@JamWaffles Le norme C sono in realtà sorprendentemente leggibile. Sono gli standard C++ che sembrano scritti da giuristi linguistici troppo zelanti. – Lalaland

+6

Poiché la questione è tecnicamente chiede quanto a "C++" header #include dovrebbe essere usato al posto di # include . – lefticus

0

Non funziona?

const double infinity = 1.0/0.0; 
9

Non sono sicuro del motivo per cui non è possibile utilizzare std :: numeric_limits in un file di intestazione.Ma c'è anche questo riportato da ANSI C:

#include <cfloat> 

DBL_MAX 
0
#include <cmath> 
... 
double d = INFINITY; 

Potete trovare INFINITY definito <cmath> (math.h):

Un'espressione costante di tipo float che rappresenta l'infinito positivo o senza segno, se disponibile; altrimenti una costante positiva di tipo float che trabocca in fase di traduzione.

1

Da Wikipedia:

0x 7ff0 0000 0000 0000 = Infinity 
0x fff0 0000 0000 0000 = −Infinity 
+0

Ovviamente, l'OP potrebbe trovarsi su una piattaforma che non utilizza i numeri in virgola mobile IEEE. – Omnifarious

+0

@Quanto ci sono? – fge

+0

Non conosco nessuna piattaforma corrente. Ma il mio vecchio sistema Atari a 8 bit no (e sì, aveva un punto a virgola mobile). Ma è cattiva forma a prescindere. Non si può dire che il punto di viraggio IEEE sarà come le cose vanno fatte in dieci anni. Questo invita alla creazione di un altro "bug del millennio". – Omnifarious

19

numeric_limits funzioni sono tutti constexpr in modo che funzionano bene come costanti in fase di compilazione (supponendo che si sta utilizzando la versione corrente di C++). Quindi std::numeric_limits<double>::infinity() dovrebbe funzionare in qualsiasi contesto.

Anche se si sta utilizzando una versione precedente, questo sarà ancora lavorare ovunque che non si richiede una costante di tempo di compilazione. Non è chiaro dalla tua domanda se il tuo uso ha davvero bisogno di una costante di tempo di compilazione o meno; essere semplicemente in testata non lo richiede necessariamente.

Se si utilizza una versione precedente, e si ha realmente bisogno di un tempo di compilazione costante, la macro INFINITY in cmath dovrebbe funzionare per voi. In realtà è il valore float per infinito, ma può essere convertito in double.

1

DBL_MAX può essere utilizzato. Questo si trova nel float.h come segue

#define DBL_MAX   1.7976931348623158e+308 /* max value */ 
Problemi correlati