En 20041008171943$, Vincent Lefevre va escriure:Par exemple, si on considère k || 1 / 0 (j'ai pris volontairement
quelque chose qui n'était pas constant devant le ||),
Soit [k] n'est pas constant, et on est hors du cadre.
Pourquoi hors du cadre?
Parce que s'il n'est pas constant (en réalité, constament nul ou non nul),
l'expression n'est pas une expression constante (!), et rien du 6.6 ne peut
s'appliquer.
Une expression constante est un lexème non terminal: autrement dit, c'est
utile là où c'est attendu, mais c'est une notion inutile ailleurs. Par
exemple, on se moque royalement de savoir que 10 est constant dans
int i = mon_strtoi(input, NULL, 10);
En 20041008171943$5c66@vinc17.org, Vincent Lefevre va escriure:
Par exemple, si on considère k || 1 / 0 (j'ai pris volontairement
quelque chose qui n'était pas constant devant le ||),
Soit [k] n'est pas constant, et on est hors du cadre.
Pourquoi hors du cadre?
Parce que s'il n'est pas constant (en réalité, constament nul ou non nul),
l'expression n'est pas une expression constante (!), et rien du 6.6 ne peut
s'appliquer.
Une expression constante est un lexème non terminal: autrement dit, c'est
utile là où c'est attendu, mais c'est une notion inutile ailleurs. Par
exemple, on se moque royalement de savoir que 10 est constant dans
int i = mon_strtoi(input, NULL, 10);
En 20041008171943$, Vincent Lefevre va escriure:Par exemple, si on considère k || 1 / 0 (j'ai pris volontairement
quelque chose qui n'était pas constant devant le ||),
Soit [k] n'est pas constant, et on est hors du cadre.
Pourquoi hors du cadre?
Parce que s'il n'est pas constant (en réalité, constament nul ou non nul),
l'expression n'est pas une expression constante (!), et rien du 6.6 ne peut
s'appliquer.
Une expression constante est un lexème non terminal: autrement dit, c'est
utile là où c'est attendu, mais c'est une notion inutile ailleurs. Par
exemple, on se moque royalement de savoir que 10 est constant dans
int i = mon_strtoi(input, NULL, 10);
En 20041008173027$, Vincent Lefevre va escriure:Donc tu dis que dans le bout de programme suivant,
Les appels de fonction sont interdits dans l'évaluation des expressions
constantes, et je ne sais pas imaginer ce que cela devrait être s'ils le
fussent.
En 20041008173027$20cd@vinc17.org, Vincent Lefevre va escriure:
Donc tu dis que dans le bout de programme suivant,
Les appels de fonction sont interdits dans l'évaluation des expressions
constantes, et je ne sais pas imaginer ce que cela devrait être s'ils le
fussent.
En 20041008173027$, Vincent Lefevre va escriure:Donc tu dis que dans le bout de programme suivant,
Les appels de fonction sont interdits dans l'évaluation des expressions
constantes, et je ne sais pas imaginer ce que cela devrait être s'ils le
fussent.
Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
L'implémentation peut donc appliquer le 6.6 dessus et évaluer le 1 / 0
pendant la phase de traduction, non?
Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
L'implémentation peut donc appliquer le 6.6 dessus et évaluer le 1 / 0
pendant la phase de traduction, non?
Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
L'implémentation peut donc appliquer le 6.6 dessus et évaluer le 1 / 0
pendant la phase de traduction, non?
En 20041013215122$, Vincent Lefevre va escriure:Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
Non. Parce que la grammaire n'attend pas d'expression constante ici,
et rien (du point de vue de la grammaire) ne différencie cette
expression d'une autre plus compliquée où on comparerait par rapport
à 0.
En 20041013215122$210b@vinc17.org, Vincent Lefevre va escriure:
Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
Non. Parce que la grammaire n'attend pas d'expression constante ici,
et rien (du point de vue de la grammaire) ne différencie cette
expression d'une autre plus compliquée où on comparerait par rapport
à 0.
En 20041013215122$, Vincent Lefevre va escriure:Pour reprendre un exemple avec un programme complet (ça sera peut-être
plus clair):
int main(int argc, char **argv)
{
return argc > 1 ? 0 : 1 / 0;
}
Le 1 / 0 est bien une expression constante, non?
Non. Parce que la grammaire n'attend pas d'expression constante ici,
et rien (du point de vue de la grammaire) ne différencie cette
expression d'une autre plus compliquée où on comparerait par rapport
à 0.
J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
Mais c'est pareil pour le cas suivant, non?
static void tstall (void)
{
double x;
x = 1.1 + 16.0;
printf ("%.20gn", x);
}
Le programme ci-dessous compilé avec gcc -stdcÉ9 -O2 -lm affiche
sur ma machine:
__STDC_IEC_559__ defined:
The implementation shall conform to the IEEE-754 standard.
FLT_EVAL_METHOD is 0 (see ISO/IEC 9899, 5.2.4.2.2#7).
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.100000000000001421
Rounding to -oo
17.100000000000001421
Rounding to +oo
17.100000000000001421
Si je remplace la fonction tstall par
double x, y;
x = 1.1; y = 16.0;
printf ("%.20gn", x + y);
j'obtiens:
[couic]
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.099999999999997868
Bug de gcc?
J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
Mais c'est pareil pour le cas suivant, non?
static void tstall (void)
{
double x;
x = 1.1 + 16.0;
printf ("%.20gn", x);
}
Le programme ci-dessous compilé avec gcc -stdcÉ9 -O2 -lm affiche
sur ma machine:
__STDC_IEC_559__ defined:
The implementation shall conform to the IEEE-754 standard.
FLT_EVAL_METHOD is 0 (see ISO/IEC 9899, 5.2.4.2.2#7).
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.100000000000001421
Rounding to -oo
17.100000000000001421
Rounding to +oo
17.100000000000001421
Si je remplace la fonction tstall par
double x, y;
x = 1.1; y = 16.0;
printf ("%.20gn", x + y);
j'obtiens:
[couic]
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.099999999999997868
Bug de gcc?
J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
Mais c'est pareil pour le cas suivant, non?
static void tstall (void)
{
double x;
x = 1.1 + 16.0;
printf ("%.20gn", x);
}
Le programme ci-dessous compilé avec gcc -stdcÉ9 -O2 -lm affiche
sur ma machine:
__STDC_IEC_559__ defined:
The implementation shall conform to the IEEE-754 standard.
FLT_EVAL_METHOD is 0 (see ISO/IEC 9899, 5.2.4.2.2#7).
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.100000000000001421
Rounding to -oo
17.100000000000001421
Rounding to +oo
17.100000000000001421
Si je remplace la fonction tstall par
double x, y;
x = 1.1; y = 16.0;
printf ("%.20gn", x + y);
j'obtiens:
[couic]
Rounding to nearest
17.100000000000001421
Rounding toward 0
17.099999999999997868
Bug de gcc?
En 20041015190901$, Vincent Lefevre va escriure:J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
La raison à cela est que l'évaluation à la compilation des expressions
constantes est une optimisation (payante et sans grand risque, sauf cas
particuliers comme les compilateurs croisés) qui est peu difficile à
implanter puisque la grammaire oblige de toute manière le compilateur à
savoir réduire une expression constante, dans les cas où on attends une
constante (taille de tableau, initialisation, etc.)
ÀMHA on sort de la discussion précédente : de tous temps les
flottants ont été une bête à part.
En supposant que tu as utilisé FP_CONTRACT OFF...
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
Pour moi, le fait que gcc ignore FP_CONTRACT OFF devrait l'obliger à
ne jamais faire de contraction (ce qu'il fait manifestement ici).
Mais la norme est assez floue sur le sujet, il y a bien une
recommendation (F.6) qui va dans ce sens, mais comme c'est une
recommendation on peut également s'en servir pour dire que le
comportement inverse est conforme !
En 20041015190901$6139@vinc17.org, Vincent Lefevre va escriure:
J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
La raison à cela est que l'évaluation à la compilation des expressions
constantes est une optimisation (payante et sans grand risque, sauf cas
particuliers comme les compilateurs croisés) qui est peu difficile à
implanter puisque la grammaire oblige de toute manière le compilateur à
savoir réduire une expression constante, dans les cas où on attends une
constante (taille de tableau, initialisation, etc.)
ÀMHA on sort de la discussion précédente : de tous temps les
flottants ont été une bête à part.
En supposant que tu as utilisé FP_CONTRACT OFF...
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
Pour moi, le fait que gcc ignore FP_CONTRACT OFF devrait l'obliger à
ne jamais faire de contraction (ce qu'il fait manifestement ici).
Mais la norme est assez floue sur le sujet, il y a bien une
recommendation (F.6) qui va dans ce sens, mais comme c'est une
recommendation on peut également s'en servir pour dire que le
comportement inverse est conforme !
En 20041015190901$, Vincent Lefevre va escriure:J'ai toujours vu les compilateurs évaluer des choses constantes à
la compilation, même si la grammaire n'attend pas une expression
constante.
La raison à cela est que l'évaluation à la compilation des expressions
constantes est une optimisation (payante et sans grand risque, sauf cas
particuliers comme les compilateurs croisés) qui est peu difficile à
implanter puisque la grammaire oblige de toute manière le compilateur à
savoir réduire une expression constante, dans les cas où on attends une
constante (taille de tableau, initialisation, etc.)
ÀMHA on sort de la discussion précédente : de tous temps les
flottants ont été une bête à part.
En supposant que tu as utilisé FP_CONTRACT OFF...
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
Pour moi, le fait que gcc ignore FP_CONTRACT OFF devrait l'obliger à
ne jamais faire de contraction (ce qu'il fait manifestement ici).
Mais la norme est assez floue sur le sujet, il y a bien une
recommendation (F.6) qui va dans ce sens, mais comme c'est une
recommendation on peut également s'en servir pour dire que le
comportement inverse est conforme !
Dans l'article <ckvupk$8hp$,
Antoine Leca écrit:
Sauf qu'une optimisation ne devrait pas rendre quelque chose non
conforme à la norme.
En supposant que tu as utilisé FP_CONTRACT OFF...
De toute façon, comme tu le dis plus loin, c'est ignoré:
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
... en espérant qu'ils veuillent bien corriger.
J'avais vu dans les archives une discussion à propos d'un autre bug
de gcc et les flottants
Est-ce que la norme autorise les implémentations à ne pas reconnaître
les pragmas qu'elle définit?
Dans l'article <ckvupk$8hp$1@shakotay.alphanet.ch>,
Antoine Leca <root@localhost.gov> écrit:
Sauf qu'une optimisation ne devrait pas rendre quelque chose non
conforme à la norme.
En supposant que tu as utilisé FP_CONTRACT OFF...
De toute façon, comme tu le dis plus loin, c'est ignoré:
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
... en espérant qu'ils veuillent bien corriger.
J'avais vu dans les archives une discussion à propos d'un autre bug
de gcc et les flottants
Est-ce que la norme autorise les implémentations à ne pas reconnaître
les pragmas qu'elle définit?
Dans l'article <ckvupk$8hp$,
Antoine Leca écrit:
Sauf qu'une optimisation ne devrait pas rendre quelque chose non
conforme à la norme.
En supposant que tu as utilisé FP_CONTRACT OFF...
De toute façon, comme tu le dis plus loin, c'est ignoré:
Je dirais que oui. Je pense que c'est un sujet que tu devrais ouvrir
sur la liste de gcc, et attendre l'avis de Joseph Myers...
... en espérant qu'ils veuillent bien corriger.
J'avais vu dans les archives une discussion à propos d'un autre bug
de gcc et les flottants
Est-ce que la norme autorise les implémentations à ne pas reconnaître
les pragmas qu'elle définit?
Avant de corriger (qui nécessite certainement du boulot, et qui risque de
pénaliser les performances), il faut les convaincre que c'est non conforme.
En l'occurence, quand je lis
/Whether and how floating expressions are contracted when not
disallowed by the FP_CONTRACT pragma (C99 6.5)./
Expressions are currently only contracted if
-funsafe-math-optimizations or -ffast-math are used.
This is subject to change.
Mais si tu veux seulement être en accord avec la norme, une manière
facile c'est de ne jamais faire de contraction en mode OFF, même
quand elles sont inoffensives: par exemple, si tu écris 1.0 + 1.0 +
1.0 + 1.0, le compilo devrait pouvoir toujours contracter, mais il
est libre de ne pas le faire! En faisant cela, les performances vont
chuter (probablement pas de beaucoup, mais l'impact psychologique
sera important); cela pourrait amener la plupart des programmeurs à
éviter à tout prix de mettre FP_CONTRACT OFF (ce qui ÀMHA est la
position de base de ceux qui ont mis cela dans la norme). C'est
probablement un bon compromis à proposer aux gens de GCC.
J'avais vu dans les archives une discussion à propos d'un autre
bug de gcc et les flottants
Regarde bien le code d'aujourd'hui; [...]
En plus, FP_CONTRACT fait partie formellement de <math.h>, donc
d'une implémentation hébergée; hors GCC est nominalement une
implémentation indépendante, et la bibliothèque mathématique est
"ailleurs" (cela étant, si tu te pointes avec ce rapport de bogue
chez glibc, je vois d'ici le résultat! ;-))) )
Avant de corriger (qui nécessite certainement du boulot, et qui risque de
pénaliser les performances), il faut les convaincre que c'est non conforme.
En l'occurence, quand je lis
/Whether and how floating expressions are contracted when not
disallowed by the FP_CONTRACT pragma (C99 6.5)./
Expressions are currently only contracted if
-funsafe-math-optimizations or -ffast-math are used.
This is subject to change.
Mais si tu veux seulement être en accord avec la norme, une manière
facile c'est de ne jamais faire de contraction en mode OFF, même
quand elles sont inoffensives: par exemple, si tu écris 1.0 + 1.0 +
1.0 + 1.0, le compilo devrait pouvoir toujours contracter, mais il
est libre de ne pas le faire! En faisant cela, les performances vont
chuter (probablement pas de beaucoup, mais l'impact psychologique
sera important); cela pourrait amener la plupart des programmeurs à
éviter à tout prix de mettre FP_CONTRACT OFF (ce qui ÀMHA est la
position de base de ceux qui ont mis cela dans la norme). C'est
probablement un bon compromis à proposer aux gens de GCC.
J'avais vu dans les archives une discussion à propos d'un autre
bug de gcc et les flottants
Regarde bien le code d'aujourd'hui; [...]
En plus, FP_CONTRACT fait partie formellement de <math.h>, donc
d'une implémentation hébergée; hors GCC est nominalement une
implémentation indépendante, et la bibliothèque mathématique est
"ailleurs" (cela étant, si tu te pointes avec ce rapport de bogue
chez glibc, je vois d'ici le résultat! ;-))) )
Avant de corriger (qui nécessite certainement du boulot, et qui risque de
pénaliser les performances), il faut les convaincre que c'est non conforme.
En l'occurence, quand je lis
/Whether and how floating expressions are contracted when not
disallowed by the FP_CONTRACT pragma (C99 6.5)./
Expressions are currently only contracted if
-funsafe-math-optimizations or -ffast-math are used.
This is subject to change.
Mais si tu veux seulement être en accord avec la norme, une manière
facile c'est de ne jamais faire de contraction en mode OFF, même
quand elles sont inoffensives: par exemple, si tu écris 1.0 + 1.0 +
1.0 + 1.0, le compilo devrait pouvoir toujours contracter, mais il
est libre de ne pas le faire! En faisant cela, les performances vont
chuter (probablement pas de beaucoup, mais l'impact psychologique
sera important); cela pourrait amener la plupart des programmeurs à
éviter à tout prix de mettre FP_CONTRACT OFF (ce qui ÀMHA est la
position de base de ceux qui ont mis cela dans la norme). C'est
probablement un bon compromis à proposer aux gens de GCC.
J'avais vu dans les archives une discussion à propos d'un autre
bug de gcc et les flottants
Regarde bien le code d'aujourd'hui; [...]
En plus, FP_CONTRACT fait partie formellement de <math.h>, donc
d'une implémentation hébergée; hors GCC est nominalement une
implémentation indépendante, et la bibliothèque mathématique est
"ailleurs" (cela étant, si tu te pointes avec ce rapport de bogue
chez glibc, je vois d'ici le résultat! ;-))) )