L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Dans l'article ,
Vincent Belaïche écrit:En tout cas pour un truc (le printf("%a",...) ) spécifié depuis 10ans,
c'est surprenant que ce ne soit pas déjà de base dans MinGW (je crois
que j'ai installé sur cette machine MinGW depuis moins d'un an).
C'est de la faute de Microsoft:
http://oldwiki.mingw.org/index.php/C99
http://groupes.codes-sources.com/article-mingw-c99-fut-printf-amies-drosophiles-serrez-miches-2300.aspx
Dans l'article <4BBACE6F.2020209@gmail.com>,
Vincent Belaïche <vincent.belaiche@gmail.com> écrit:
En tout cas pour un truc (le printf("%a",...) ) spécifié depuis 10ans,
c'est surprenant que ce ne soit pas déjà de base dans MinGW (je crois
que j'ai installé sur cette machine MinGW depuis moins d'un an).
C'est de la faute de Microsoft:
http://oldwiki.mingw.org/index.php/C99
http://groupes.codes-sources.com/article-mingw-c99-fut-printf-amies-drosophiles-serrez-miches-2300.aspx
Dans l'article ,
Vincent Belaïche écrit:En tout cas pour un truc (le printf("%a",...) ) spécifié depuis 10ans,
c'est surprenant que ce ne soit pas déjà de base dans MinGW (je crois
que j'ai installé sur cette machine MinGW depuis moins d'un an).
C'est de la faute de Microsoft:
http://oldwiki.mingw.org/index.php/C99
http://groupes.codes-sources.com/article-mingw-c99-fut-printf-amies-drosophiles-serrez-miches-2300.aspx
Samuel DEVULDER écrivit :L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
« le lecteur attentif rectifiera de lui-même », et je sais bien aussi
que la réponse de Vincent (%a) exige C99 (et je le déplore), mais elle a
au moins le mérite d'être sensiblement plus simple, et elle évite tous
les problèmes de numérotations des bits et des bytes qu'auraient une
version revue (avec unsigned char i[sizeof(double]) de l'union.
Samuel DEVULDER écrivit :
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
« le lecteur attentif rectifiera de lui-même », et je sais bien aussi
que la réponse de Vincent (%a) exige C99 (et je le déplore), mais elle a
au moins le mérite d'être sensiblement plus simple, et elle évite tous
les problèmes de numérotations des bits et des bytes qu'auraient une
version revue (avec unsigned char i[sizeof(double]) de l'union.
Samuel DEVULDER écrivit :L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
« le lecteur attentif rectifiera de lui-même », et je sais bien aussi
que la réponse de Vincent (%a) exige C99 (et je le déplore), mais elle a
au moins le mérite d'être sensiblement plus simple, et elle évite tous
les problèmes de numérotations des bits et des bytes qu'auraient une
version revue (avec unsigned char i[sizeof(double]) de l'union.
Vincent est un universitaire; et qui plus est, un universitaire qui
travaille précisément sur ce sujet des nombres flottants, et qui publie.
Je ne t'apprend pas que dans le monde universitaire, « la littérature »
se réfère à l'ensemble des publications sur un sujet, et une partie
importante du travail de recherche est justement de trier dans « la
littérature » le bon grain de l'ivraie, pour ensuite intégrer dans ses
propres publications (par référence) la « bonne » littérature.
Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Moi:
> Vincent:
> Tout dépend de l'implémentation, qui peut très bien utiliser
> 1 à chaque fois (sauf pour zéro). Je rappelle que l'exposant est
> binaire.
Binaire? genre p-10 veut dire 2-16? la doc que j'ai trouvée
http://www.opengroup.org/onlinepubs/000095399/functions/printf.html
dit exposant décimal (donc 2-10 = 1/1024 ici).
sens; et donc il t'a donné un conseil qui a d'autant plus de valeur
qu'il a une longue expérience de cette fameuse littérature à laquelle tu
faisais référence.
Certes. Mais comme il s'agit tout autant d'un exposant binaire
(puissance de deux qui modifie la mantisse), il y a ambiguïté.
Une autre ambiguïté est que le mot exposant peut signifier soit la
valeur entière, soit le résultat après exponentiation. Enfin, là c'est
ma lecture du sujet, peut-être que je me trompes ici.
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
la position de Vincent, et je le comprend comme étant la vision des
spécialistes du domaine (dont je ne suis pas), est de mettre plus
d'emphase sur la différence avec le format %e (celui des calculatrices
scientifiques), en particulier le choix de la base.
Vincent est un universitaire; et qui plus est, un universitaire qui
travaille précisément sur ce sujet des nombres flottants, et qui publie.
Je ne t'apprend pas que dans le monde universitaire, « la littérature »
se réfère à l'ensemble des publications sur un sujet, et une partie
importante du travail de recherche est justement de trier dans « la
littérature » le bon grain de l'ivraie, pour ensuite intégrer dans ses
propres publications (par référence) la « bonne » littérature.
Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Moi:
> Vincent:
> Tout dépend de l'implémentation, qui peut très bien utiliser
> 1 à chaque fois (sauf pour zéro). Je rappelle que l'exposant est
> binaire.
Binaire? genre p-10 veut dire 2-16? la doc que j'ai trouvée
http://www.opengroup.org/onlinepubs/000095399/functions/printf.html
dit exposant décimal (donc 2-10 = 1/1024 ici).
sens; et donc il t'a donné un conseil qui a d'autant plus de valeur
qu'il a une longue expérience de cette fameuse littérature à laquelle tu
faisais référence.
Certes. Mais comme il s'agit tout autant d'un exposant binaire
(puissance de deux qui modifie la mantisse), il y a ambiguïté.
Une autre ambiguïté est que le mot exposant peut signifier soit la
valeur entière, soit le résultat après exponentiation. Enfin, là c'est
ma lecture du sujet, peut-être que je me trompes ici.
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
la position de Vincent, et je le comprend comme étant la vision des
spécialistes du domaine (dont je ne suis pas), est de mettre plus
d'emphase sur la différence avec le format %e (celui des calculatrices
scientifiques), en particulier le choix de la base.
Vincent est un universitaire; et qui plus est, un universitaire qui
travaille précisément sur ce sujet des nombres flottants, et qui publie.
Je ne t'apprend pas que dans le monde universitaire, « la littérature »
se réfère à l'ensemble des publications sur un sujet, et une partie
importante du travail de recherche est justement de trier dans « la
littérature » le bon grain de l'ivraie, pour ensuite intégrer dans ses
propres publications (par référence) la « bonne » littérature.
Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Moi:
> Vincent:
> Tout dépend de l'implémentation, qui peut très bien utiliser
> 1 à chaque fois (sauf pour zéro). Je rappelle que l'exposant est
> binaire.
Binaire? genre p-10 veut dire 2-16? la doc que j'ai trouvée
http://www.opengroup.org/onlinepubs/000095399/functions/printf.html
dit exposant décimal (donc 2-10 = 1/1024 ici).
sens; et donc il t'a donné un conseil qui a d'autant plus de valeur
qu'il a une longue expérience de cette fameuse littérature à laquelle tu
faisais référence.
Certes. Mais comme il s'agit tout autant d'un exposant binaire
(puissance de deux qui modifie la mantisse), il y a ambiguïté.
Une autre ambiguïté est que le mot exposant peut signifier soit la
valeur entière, soit le résultat après exponentiation. Enfin, là c'est
ma lecture du sujet, peut-être que je me trompes ici.
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
la position de Vincent, et je le comprend comme étant la vision des
spécialistes du domaine (dont je ne suis pas), est de mettre plus
d'emphase sur la différence avec le format %e (celui des calculatrices
scientifiques), en particulier le choix de la base.
Samuel DEVULDER writes:L'erreur vient peut être de celui qui attribue un context hyper spécifique
(C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Hyper-spécifique? Le type qui charge un Linux grand public pour voir pour
un processeur pas trop obsolète a une chance non négligable de se retrouver
dans cet environnement.
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> writes:
L'erreur vient peut être de celui qui attribue un context hyper spécifique
(C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Hyper-spécifique? Le type qui charge un Linux grand public pour voir pour
un processeur pas trop obsolète a une chance non négligable de se retrouver
dans cet environnement.
Samuel DEVULDER writes:L'erreur vient peut être de celui qui attribue un context hyper spécifique
(C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Hyper-spécifique? Le type qui charge un Linux grand public pour voir pour
un processeur pas trop obsolète a une chance non négligable de se retrouver
dans cet environnement.
C'est pour cela que j'avais indiqué %a.
Encore faut il que ce soit une vraie erreur. Un bout de code juste pour
C89 pourra être considéré comme une erreur en C99.
C'est très rare.
Alors où se situe l'erreur? Dans le code ou dans le fait que le
contexte du code ne soit pas précisé?
Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
La seule norme C est actuellement la version de 1999 (a.k.a. C99).
C89 n'est plus une norme, même si on peut en parler...
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Si on ne précise pas sizeof(long), il faut considérer toutes les
possibilités, surtout celles existantes en pratique (il faudrait
aussi considérer les bits de padding éventuels, le cas CHAR_BIT
différent de 8...).
C'est pour cela que j'avais indiqué %a.
Encore faut il que ce soit une vraie erreur. Un bout de code juste pour
C89 pourra être considéré comme une erreur en C99.
C'est très rare.
Alors où se situe l'erreur? Dans le code ou dans le fait que le
contexte du code ne soit pas précisé?
Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
La seule norme C est actuellement la version de 1999 (a.k.a. C99).
C89 n'est plus une norme, même si on peut en parler...
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Si on ne précise pas sizeof(long), il faut considérer toutes les
possibilités, surtout celles existantes en pratique (il faudrait
aussi considérer les bits de padding éventuels, le cas CHAR_BIT
différent de 8...).
C'est pour cela que j'avais indiqué %a.
Encore faut il que ce soit une vraie erreur. Un bout de code juste pour
C89 pourra être considéré comme une erreur en C99.
C'est très rare.
Alors où se situe l'erreur? Dans le code ou dans le fait que le
contexte du code ne soit pas précisé?
Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
La seule norme C est actuellement la version de 1999 (a.k.a. C99).
C89 n'est plus une norme, même si on peut en parler...
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Si on ne précise pas sizeof(long), il faut considérer toutes les
possibilités, surtout celles existantes en pratique (il faudrait
aussi considérer les bits de padding éventuels, le cas CHAR_BIT
différent de 8...).
Samuel DEVULDER écrivit :Ok c'est plus clair à présent, sauf que je ne vois pas pourquoi on a
laissé un choix arbitraire pour ce 1er digit.
Comme tu le dis si bien, c'est arbitraire.
Maintenant, il existe un monde avant 1999, et en particulier dans ce
monde réel il y a des implémentations (hardware) où les flottants sont
représentés en base 10, et d'autres (en particulier chez IBM SJMSB) en
base 16! Et il aurait été stupide de la part du comité C de décider
arbitrairement pour une représentation qui aurait été incompatible avec
l'existant, ou qui aurait arbitrairement compliqué les implémentations
existantes : imagine le cas où ta machine cause la base 16 mais ce que
te montre %a est différent d'un vidage mémoire... à cause d'un décalage
de 1 ou 2 bits.
de toute façon la base de l'exponentielle est 2 (p=pow(2,.)),
Bin non justement, le fond du problème est bien là.
Antoine
Samuel DEVULDER écrivit :
Ok c'est plus clair à présent, sauf que je ne vois pas pourquoi on a
laissé un choix arbitraire pour ce 1er digit.
Comme tu le dis si bien, c'est arbitraire.
Maintenant, il existe un monde avant 1999, et en particulier dans ce
monde réel il y a des implémentations (hardware) où les flottants sont
représentés en base 10, et d'autres (en particulier chez IBM SJMSB) en
base 16! Et il aurait été stupide de la part du comité C de décider
arbitrairement pour une représentation qui aurait été incompatible avec
l'existant, ou qui aurait arbitrairement compliqué les implémentations
existantes : imagine le cas où ta machine cause la base 16 mais ce que
te montre %a est différent d'un vidage mémoire... à cause d'un décalage
de 1 ou 2 bits.
de toute façon la base de l'exponentielle est 2 (p=pow(2,.)),
Bin non justement, le fond du problème est bien là.
Antoine
Samuel DEVULDER écrivit :Ok c'est plus clair à présent, sauf que je ne vois pas pourquoi on a
laissé un choix arbitraire pour ce 1er digit.
Comme tu le dis si bien, c'est arbitraire.
Maintenant, il existe un monde avant 1999, et en particulier dans ce
monde réel il y a des implémentations (hardware) où les flottants sont
représentés en base 10, et d'autres (en particulier chez IBM SJMSB) en
base 16! Et il aurait été stupide de la part du comité C de décider
arbitrairement pour une représentation qui aurait été incompatible avec
l'existant, ou qui aurait arbitrairement compliqué les implémentations
existantes : imagine le cas où ta machine cause la base 16 mais ce que
te montre %a est différent d'un vidage mémoire... à cause d'un décalage
de 1 ou 2 bits.
de toute façon la base de l'exponentielle est 2 (p=pow(2,.)),
Bin non justement, le fond du problème est bien là.
Antoine
>> Encore faut il que ce soit une vraie erreur. Un bout de code
>> juste pour C89 pourra être considéré comme une erreur en C99.
>
> C'est très rare.
Peut-être, mais depuis être très rare quand devient une raison valable?
Les machines ayant un CHAR_BIT de 12 sont rares elles aussi, et pourtant
j'en connais qui grognent quand ils voient écrit:
char buf[sizeof(double)];
parce que ça introduit des pad-bits pas super clairement.
Voici quelques exemples (non exhaustifs) de ce qui passait sous C89 mais
plus sous C99:
http://usenix.org/publications/login/2002-10/pdfs/mccluskey.pdf
Autre truc. C99 est plus stricte que C89. Normalement C89 laisse passer
ce qui suit, mais pas C99:
char *s=...
unsigned char *t=s; /* erreur avec C99 */
> Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
> La seule norme C est actuellement la version de 1999 (a.k.a. C99).
> C89 n'est plus une norme, même si on peut en parler...
Pourquoi ?
>> Encore faut il que ce soit une vraie erreur. Un bout de code
>> juste pour C89 pourra être considéré comme une erreur en C99.
>
> C'est très rare.
Peut-être, mais depuis être très rare quand devient une raison valable?
Les machines ayant un CHAR_BIT de 12 sont rares elles aussi, et pourtant
j'en connais qui grognent quand ils voient écrit:
char buf[sizeof(double)];
parce que ça introduit des pad-bits pas super clairement.
Voici quelques exemples (non exhaustifs) de ce qui passait sous C89 mais
plus sous C99:
http://usenix.org/publications/login/2002-10/pdfs/mccluskey.pdf
Autre truc. C99 est plus stricte que C89. Normalement C89 laisse passer
ce qui suit, mais pas C99:
char *s=...
unsigned char *t=s; /* erreur avec C99 */
> Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
> La seule norme C est actuellement la version de 1999 (a.k.a. C99).
> C89 n'est plus une norme, même si on peut en parler...
Pourquoi ?
>> Encore faut il que ce soit une vraie erreur. Un bout de code
>> juste pour C89 pourra être considéré comme une erreur en C99.
>
> C'est très rare.
Peut-être, mais depuis être très rare quand devient une raison valable?
Les machines ayant un CHAR_BIT de 12 sont rares elles aussi, et pourtant
j'en connais qui grognent quand ils voient écrit:
char buf[sizeof(double)];
parce que ça introduit des pad-bits pas super clairement.
Voici quelques exemples (non exhaustifs) de ce qui passait sous C89 mais
plus sous C99:
http://usenix.org/publications/login/2002-10/pdfs/mccluskey.pdf
Autre truc. C99 est plus stricte que C89. Normalement C89 laisse passer
ce qui suit, mais pas C99:
char *s=...
unsigned char *t=s; /* erreur avec C99 */
> Quand on ne précise pas le contexte, c'est celui de la norme C ISO.
> La seule norme C est actuellement la version de 1999 (a.k.a. C99).
> C89 n'est plus une norme, même si on peut en parler...
Pourquoi ?
Antoine Leca a écrit :Samuel DEVULDER écrivit :L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
J'ai une machine 16bits sous le coude et le printf %x marche plutôt bien
dessus.
Perso je n'aime pas les phrases sèches: "ce code est faux".
Il lui manque quelque chose indiquant sous quelle hypothèse c'est
faux.
Un code peut être faux sous C99 et légitime sous C89.
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
J'ai une machine 16bits sous le coude et le printf %x marche plutôt bien
dessus.
Perso je n'aime pas les phrases sèches: "ce code est faux".
Il lui manque quelque chose indiquant sous quelle hypothèse c'est
faux.
Un code peut être faux sous C99 et légitime sous C89.
Antoine Leca a écrit :Samuel DEVULDER écrivit :L'erreur vient peut être de celui qui attribue un context hyper
spécifique (C99, sizeof(long)==8) sur un truc où rien n'est précisé?
Euh... ton code (tel qu'il était) ne marchait pas non plus sur une
machine 16 bits [une de ces machines où printf("%x", un_long) n'a pas
l'effet escompté].
J'ai une machine 16bits sous le coude et le printf %x marche plutôt bien
dessus.
Perso je n'aime pas les phrases sèches: "ce code est faux".
Il lui manque quelque chose indiquant sous quelle hypothèse c'est
faux.
Un code peut être faux sous C99 et légitime sous C89.
Antoine Leca a écrit :Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Non je parlais du WEB. C'est clair depuis le début.
Oui peut être, mais en quoi le background change ce qu'on dit?
Est-ce qu'un type ultra compétant est plus utile qu'un crétin quand
tous les deux disent "Ce code est faux, cf C99"?
Son conseil aurait été plus utile s'il avait filé l'url ou, mieux,
recopié le passage de la norme qui s'y réfère. Je l'ai fait, il dit que
ca parle de "binary exponent", je ne l'ai pas retrouvé. :-/
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
C'est ce qu'on veut savoir quand on fait un printf (le fait que ce soit
binaire en mémoire on s'en tamponne pour une sortie).
Antoine Leca a écrit :
Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Non je parlais du WEB. C'est clair depuis le début.
Oui peut être, mais en quoi le background change ce qu'on dit?
Est-ce qu'un type ultra compétant est plus utile qu'un crétin quand
tous les deux disent "Ce code est faux, cf C99"?
Son conseil aurait été plus utile s'il avait filé l'url ou, mieux,
recopié le passage de la norme qui s'y réfère. Je l'ai fait, il dit que
ca parle de "binary exponent", je ne l'ai pas retrouvé. :-/
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
C'est ce qu'on veut savoir quand on fait un printf (le fait que ce soit
binaire en mémoire on s'en tamponne pour une sortie).
Antoine Leca a écrit :Je ne sais pas si dans ta pensée, le mot littérature ci-dessus avait ce
sens ;
Non je parlais du WEB. C'est clair depuis le début.
Oui peut être, mais en quoi le background change ce qu'on dit?
Est-ce qu'un type ultra compétant est plus utile qu'un crétin quand
tous les deux disent "Ce code est faux, cf C99"?
Son conseil aurait été plus utile s'il avait filé l'url ou, mieux,
recopié le passage de la norme qui s'y réfère. Je l'ai fait, il dit que
ca parle de "binary exponent", je ne l'ai pas retrouvé. :-/
Les documents auxquels tu fais référence insistent (et je le comprend
tout-à-fait, car ce n'est pas évident, surtout du fait du contexte) sur
la forme --en base 10, donc-- de la valeur de l'exposant ;
C'est ce qu'on veut savoir quand on fait un printf (le fait que ce soit
binaire en mémoire on s'en tamponne pour une sortie).