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 ?
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
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++ ?
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
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.
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 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.
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.
On 29 May 2005 09:17:44 -0700, "Tournevissette"
<tournevissette@yahoo.fr>:
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.
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.
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
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++ :-)
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
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 ? |
| > 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 ?
|
| > 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
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 ? |
| > 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 ?
|
| > 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
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.
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++ :)
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.
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++ :)
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.
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++ :)
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.
| 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.
| 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
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.
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.
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.
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.