OVH Cloud OVH Cloud

Définition de 'inf'

22 réponses
Avatar
tournevissette
Bonjour,
j'aimerais assigner '+inf' =E0 une variable, et je me demandais
comment faire ca de mani=E8re =E9l=E9gante en C/C++, qui ne g=E9n=E9rerait
aucun warning, ni a la compilation, ni =E0 l'=E9xecution.
J'ai essay=E9 :

const double inf =3D std::pow(1024.0,1024.0);

mais c'est pas tr=E8s beau. De plus, ca g=E9n=E8re un warning =E0
l'=E9xecution,
avec bcc32.
Est-ce que quelqu'un a une id=E9e ?

Merci d'avance.

10 réponses

1 2 3
Avatar
Anthony Fleury

Donc je me serais attendu à avoir une réponse indépendante de la
différence entre C et C++, même si on peut faire ca de manière
dépendante bien entendu, comme vous l'avez fait remarqué ici. Et bien
entendu, le groupe fr.comp.lang.c_c++ n'existe pas....

A méditer, non ?


Le seul problème c'est que C (C89) n'offre pas d'infini. C99 a ajouté le
INFINITY comme les réponses que tu as eu sur fcl.c. La partie
compatibilité C du C++ est basé sur C89. Donc <math.h> en C++ n'offre
pas cette macro.
C++ quant à lui offre les numeric_limits. Etant une classe, c'est
spécifique à C++ et beaucoup plus puissant que ce qui était offert par
C. La réponse est donc forcément dépendante du langage. En effet, même
si C et C++ ont un nom qui se ressemble et une base commune, ce sont
deux langages totalement différent, et on ne travaille pas pareil en C
et en C++. Par exemple, si jamais INFINITY existait dans les deux, je ne
l'utiliserais pas en C++. Autant ne pas se priver de la puissance de C++
et de ce qu'il offre.
De même, si j'ai besoin d'un tableau, je ne le ferai probablement pas à
la C (int t[42]), mais avec un std::vector<>.

En fait, ma question pour toi serait :
Vu que tu utilises du std::pow... pourquoi ne pas te contenter de la
réponse C++ ?

--
Anthony Fleury

Avatar
Tournevissette
Merci pour la réponse.
Je suis très content de la réponse C++ que vous m'avez fournie, je ne
dis pas le contraire. Cela dit, cela n'empeche pas d'être curieux et
de me poser des questions sur les pourquoi et comment du langage, en
passant.

Merci en tout cas.
Avatar
Fabien LE LEZ
On 29 May 2005 09:17:44 -0700, "Tournevissette"
:

A
priori, je peux obtenir un nombre inifi avec le même code valide en
C/C++ :


Valide en C ainsi qu'en C++, tu veux dire ?

float x;
for (x=2; x<2*x; x*=2);


Justement, j'ai des doutes sur la validité de ce code.
J'ai tenté de le compiler et de l'exécuter. Le résultat ne s'est pas
fait attendre : le processeur a bogué, et j'ai eu un joli BSOD, puis
redémarrage de la machine.
Je pense que mon processeur a un sérieux problème ; néanmoins, il y a
des chances pour qu'un PC avec un processeur en bon état affiche un
message d'erreur quelconque. Il est aussi possible que ce soit mon
compilo qui déconne.

Avatar
Anthony Fleury
Merci pour la réponse.
Je suis très content de la réponse C++ que vous m'avez fournie, je ne
dis pas le contraire. Cela dit, cela n'empeche pas d'être curieux et
de me poser des questions sur les pourquoi et comment du langage, en
passant.


Je ne suis pas du tout contre se poser des questions bien au contraire.
Vu que tu citais au départ C/C++, je pensais que tu voulais programmer
en C++ comme en C, en rajoutant seulement des classes ou des std:: :-)
J'ai donc pensé au départ que c'était pour éviter des trucs pratiques de
C++ :-)

--
Anthony Fleury

Avatar
Gabriel Dos Reis
"Tournevissette" writes:

| > Mais dans ce cas, il ne faut pas demander une approche de type C sur
| > fr.comp.lang.c++, ni une approche de type C++ sur
| > fr.comp.lang.basic...
|
| J'aime la réponse constructive...
|
| Si on regarde un peu plus loin, pourquoi la représentation d'un nombre
| flottant infini devrait être dépendante du langage C ou C++, alors
| que les deux langages proposent à-priori les mêmes opérations de
| base pour le calcul sur les flottants ?
| A mon sens, représenter la notion d'infini en C ou C++ ne devrait pas
| être dépendante de quelconques includes spécifiques C ou C++. A
| priori, je peux obtenir un nombre inifi avec le même code valide en
| C/C++ :
|
| float x;
| for (x=2; x<2*x; x*=2);
| std::fprintf(stderr,"x = %gn",x);
|
| (Les "puristes" du C++ peuvent remplacer fprintf par le cout qui va
| bien ).
| Cet exemple me renvoit bien +Inf avec gcc ET g++.

gcc me dit "syntac error"

|
| Donc je me serais attendu à avoir une réponse indépendante de la
| différence entre C et C++, même si on peut faire ca de manière
| dépendante bien entendu, comme vous l'avez fait remarqué ici. Et bien
| entendu, le groupe fr.comp.lang.c_c++ n'existe pas....
|
| A méditer, non ?
|

--
Gabriel Dos Reis

Avatar
Gabriel Dos Reis
"Tournevissette" writes:

| > Mais dans ce cas, il ne faut pas demander une approche de type C sur
| > fr.comp.lang.c++, ni une approche de type C++ sur
| > fr.comp.lang.basic...
|
| J'aime la réponse constructive...
|
| Si on regarde un peu plus loin, pourquoi la représentation d'un nombre
| flottant infini devrait être dépendante du langage C ou C++, alors
| que les deux langages proposent à-priori les mêmes opérations de
| base pour le calcul sur les flottants ?
| A mon sens, représenter la notion d'infini en C ou C++ ne devrait pas
| être dépendante de quelconques includes spécifiques C ou C++. A
| priori, je peux obtenir un nombre inifi avec le même code valide en
| C/C++ :
|
| float x;
| for (x=2; x<2*x; x*=2);
| std::fprintf(stderr,"x = %gn",x);
|
| (Les "puristes" du C++ peuvent remplacer fprintf par le cout qui va
| bien ).
| Cet exemple me renvoit bien +Inf avec gcc ET g++.

gcc me dit "syntax error"

|
| Donc je me serais attendu à avoir une réponse indépendante de la
| différence entre C et C++, même si on peut faire ca de manière
| dépendante bien entendu, comme vous l'avez fait remarqué ici. Et bien
| entendu, le groupe fr.comp.lang.c_c++ n'existe pas....
|
| A méditer, non ?
|

--
Gabriel Dos Reis

Avatar
Tournevissette
Finalement, apres quelques acrobaties, on peut s'en sortir
sans #include specifiques C ou C++. Ce n'est pas tres propre,
mais c'est juste pour la curiosite. Je vous en fais part.

En se referant a la page

http://stevehollasch.com/cgindex/coding/ieeefloat.html

qui decrit le codage des nombres flottants IEEE, on peut s'apercevoir
que l'infini peut se representer bit a bit (en float 32 bits) par :
0x7f800000. D'ou l'idee du code suivant, qui permet de definir un float
32 bits infini directement :

int tmp = 0x7f800000;
float infinity = *(float*)&tmp;

Evidemment, a prendre avec des pincettes, etant donne que ca ne marche
a priori que pour des float 32 bits. Enfin, tout ca pour dire que c'est
possible de faire un truc C/C++ :)
Avatar
Gabriel Dos Reis
"Tournevissette" writes:

| Finalement, apres quelques acrobaties, on peut s'en sortir
| sans #include specifiques C ou C++. Ce n'est pas tres propre,
| mais c'est juste pour la curiosite. Je vous en fais part.
|
| En se referant a la page
|
| http://stevehollasch.com/cgindex/coding/ieeefloat.html
|
| qui decrit le codage des nombres flottants IEEE, on peut s'apercevoir
| que l'infini peut se representer bit a bit (en float 32 bits) par :
| 0x7f800000. D'ou l'idee du code suivant, qui permet de definir un float
| 32 bits infini directement :

Sur quelle machines ?

| int tmp = 0x7f800000;
| float infinity = *(float*)&tmp;

Comportement indéfini -- tu ne peux lire un entier à travers un
pointeur sur float.

Les en-têtes, c'est pas pour le décor.

-- Gaby
Avatar
Tournevissette
Sur quelle machines ?


J'ai teste avec succes sur des PC Linux et Windows et sur des Sun
Solaris.

Pour le comportement indefini, je ne connaissais pas cette regle,
je pense que le fait que sizeof(int)==sizeof(float) sur la plupart des
architectures aide beaucoup.

Avatar
Gabriel Dos Reis
"Tournevissette" writes:

| > Sur quelle machines ?
|
| J'ai teste avec succes sur des PC Linux et Windows et sur des Sun
| Solaris.

Et cela donne quoi sur un PowerPC, un VAX ou un PDP 11?

| Pour le comportement indefini, je ne connaissais pas cette regle,

Cela n'est pas grave.

| je pense que le fait que sizeof(int)==sizeof(float) sur la plupart des
| architectures aide beaucoup.

Je présume qu'il y a ici une définition de « plupart des
architectures » qui reste à explorer. Dans tous les cas, je ne sais
pas en quoi cela aide.

-- Gaby
1 2 3