Moi j'en parle: ton code avec long int n'est pas portable, et
Finalement Misra-C a raison avec le bannissement du type "int" dans le
code. Ca n'est pas suffisant quand le nombre de bit est important.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.
Moi j'en parle: ton code avec long int n'est pas portable, et
Finalement Misra-C a raison avec le bannissement du type "int" dans le
code. Ca n'est pas suffisant quand le nombre de bit est important.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.
Moi j'en parle: ton code avec long int n'est pas portable, et
Finalement Misra-C a raison avec le bannissement du type "int" dans le
code. Ca n'est pas suffisant quand le nombre de bit est important.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.
Vincent Lefevre a écrit :
> Moi j'en parle: ton code avec long int n'est pas portable, et
Rahala... D'où sors tu que cet exemple voulait être portable?
> Mais parfois il ne l'est pas, et la bibliotheque standard utilise
> int, etc.
Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
Vincent Lefevre a écrit :
> Moi j'en parle: ton code avec long int n'est pas portable, et
Rahala... D'où sors tu que cet exemple voulait être portable?
> Mais parfois il ne l'est pas, et la bibliotheque standard utilise
> int, etc.
Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
Vincent Lefevre a écrit :
> Moi j'en parle: ton code avec long int n'est pas portable, et
Rahala... D'où sors tu que cet exemple voulait être portable?
> Mais parfois il ne l'est pas, et la bibliotheque standard utilise
> int, etc.
Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
>>> Aussi après un appel de rint...
>
>> pour savoir si un nombre est un entier ou pas?
>
> Non, pour convertir en entier parce que dans telle formule, c'est ce
> qu'on a. Si l'erreur était < 0.5, alors on obtient le vrai résultat
> (exact).
Oula.. C'est pas clair. J'arrive pas à comprendre. Je pense que tu as
trop condensé tes idées. De quelle "telle formule" parles tu? Peux tu
détailler ?
>> Pourquoi donc? tous les doubles sont sérialisés en mémoire de la même
>> façon au format IEEE.
>
> Il y a d'une part les 0 signés: dans la pratique, on veut généralement
Heu.. parles tu encore de "sérialisation" en mémoire là? J'ai
l'impression qu'on s'éloigne du propos.
> que +0 et -0 soient considérés comme la même valeur (et d'ailleurs,
> +0.0 == -0.0 en C). D'autre part, si le but est aussi de considérer
> deux NaN comme égaux, l'encodage des NaN n'est pas complètement
> normalisé, cf le payload.
Oui oui sans doute. Mais ici le but est de comparer (1.7f + 0.1) avec
(1.7 + 0.1), pas de -0.0 ou de NaN, Inf et autre dénormalisés là dedans.
Il ne faut pas tomber dans l'ultra spécialisation non plus.
http://www.abxsoft.com/misra/misra-test.html
/* Rule 50: Required */
/* Floating point variables shall not be tested for exact equality or */
/* inequality. */
MISRA-C [1998:2004] Function Definition: rule50
Il y a des cas où le test d'égalité a un sens. Mais bon...
Encore une fois je ne vois pas d'où sort la performance dans le problème
ou l'exercice consistant à examiner en mémoire la différence entre
(1.7f+0.1) et (1.7+0.1). Il ne faut pas inventer des pbs là où il n'y en
a pas.
Vincent Lefevre a écrit :
> 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).
J'imagine que 1/0.0 donne +infty, et 1/-0.0 donne sans doute -infty?
Vincent Lefevre a écrit :
> 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).
J'imagine que 1/0.0 donne +infty, et 1/-0.0 donne sans doute -infty?
Vincent Lefevre a écrit :
> 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).
J'imagine que 1/0.0 donne +infty, et 1/-0.0 donne sans doute -infty?
Sinon mis à part ça j'ai fait un essai de %a avec gcc version 3.4.5, et
ça ne le fait pas.
int main(void)
{
printf("H%a h%a h%a !n",3.14,0.0,12345.0);
printf("%f %f %f n",0x3.23D70A3Dp0, 0x.p0, 0x3039.p0);
return 0;
}
ça fait:
Ha ha ha !
3.140000 0.000000 12345.000000
Ce qui prouve que les constantes sont implantées, mais pas le printf.
Sinon mis à part ça j'ai fait un essai de %a avec gcc version 3.4.5, et
ça ne le fait pas.
int main(void)
{
printf("H%a h%a h%a !n",3.14,0.0,12345.0);
printf("%f %f %f n",0x3.23D70A3Dp0, 0x.p0, 0x3039.p0);
return 0;
}
ça fait:
Ha ha ha !
3.140000 0.000000 12345.000000
Ce qui prouve que les constantes sont implantées, mais pas le printf.
Sinon mis à part ça j'ai fait un essai de %a avec gcc version 3.4.5, et
ça ne le fait pas.
int main(void)
{
printf("H%a h%a h%a !n",3.14,0.0,12345.0);
printf("%f %f %f n",0x3.23D70A3Dp0, 0x.p0, 0x3039.p0);
return 0;
}
ça fait:
Ha ha ha !
3.140000 0.000000 12345.000000
Ce qui prouve que les constantes sont implantées, mais pas le printf.
"Exposant binaire" signifie que cela donne 2^e. Je ne parle pas de
l'écriture de l'exposant, mais de sa sémantique.
"Exposant binaire" signifie que cela donne 2^e. Je ne parle pas de
l'écriture de l'exposant, mais de sa sémantique.
"Exposant binaire" signifie que cela donne 2^e. Je ne parle pas de
l'écriture de l'exposant, mais de sa sémantique.
Dans l'article <4bb763aa$0$8296$,
Samuel DEVULDER écrit:Vincent Lefevre a écrit :Moi j'en parle: ton code avec long int n'est pas portable, etRahala... D'où sors tu que cet exemple voulait être portable?
Ici, on écrit du C portable. Ou alors on précise l'architecture
Ou alors on précise l'architecture
en question. En tout cas, l'OP ne l'a pas fait, et ton code n'a
aucune raison de fonctionner sur sa machine.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
N'importe quoi.
et les spec sont indépendantes du système.mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
On peut utiliser la bibliothèque standard tout en étant portable.
D'ailleurs, c'est fait pour.
Dans l'article <4bb763aa$0$8296$426a74cc@news.free.fr>,
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> écrit:
Vincent Lefevre a écrit :
Moi j'en parle: ton code avec long int n'est pas portable, et
Rahala... D'où sors tu que cet exemple voulait être portable?
Ici, on écrit du C portable. Ou alors on précise l'architecture
Ou alors on précise l'architecture
en question. En tout cas, l'OP ne l'a pas fait, et ton code n'a
aucune raison de fonctionner sur sa machine.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.
Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
N'importe quoi.
et les spec sont indépendantes du système.
mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
On peut utiliser la bibliothèque standard tout en étant portable.
D'ailleurs, c'est fait pour.
Dans l'article <4bb763aa$0$8296$,
Samuel DEVULDER écrit:Vincent Lefevre a écrit :Moi j'en parle: ton code avec long int n'est pas portable, etRahala... D'où sors tu que cet exemple voulait être portable?
Ici, on écrit du C portable. Ou alors on précise l'architecture
Ou alors on précise l'architecture
en question. En tout cas, l'OP ne l'a pas fait, et ton code n'a
aucune raison de fonctionner sur sa machine.
Mais parfois il ne l'est pas, et la bibliotheque standard utilise
int, etc.Misra-C ne s'applique pas aux bibliothèques du compilo (qui sont
targetées pour un système précis),
N'importe quoi.
et les spec sont indépendantes du système.mais au code qu'on écrit soit-même et qui lui doit être portable: il
doit tourner sur des ECU 8/16bits tout comme 32/64, avec byte-order
des plus variés... Mais c'est un autre sujet.
On peut utiliser la bibliothèque standard tout en étant portable.
D'ailleurs, c'est fait pour.
Dans l'article <4bafbb44$0$16460$,
Samuel DEVULDER écrit:Emmanuel a écrit :> int main(void) {
> float x;
> x = 1.7;
> return ((x + 0.1) == 1.8) ? 1 : 0;
> }
>
> j'obtiens :
>
> $ gcc -Wall -o essai essai.c; ./essai; echo $?
> 0Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
(et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
de précision).
float = 24 bits de précision
double = 53 bits de précision
(à cause du bit implicite). Le 1.7 est un double, converti en float;
c'est différent de 1.7f (ici, le résultat est le même, mais il peut
y avoir des différences). Dans la pratique, cela peut être encore
plus complexe.
Dans l'article <4bafbb44$0$16460$426a74cc@news.free.fr>,
Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> écrit:
Emmanuel a écrit :
> int main(void) {
> float x;
> x = 1.7;
> return ((x + 0.1) == 1.8) ? 1 : 0;
> }
>
> j'obtiens :
>
> $ gcc -Wall -o essai essai.c; ./essai; echo $?
> 0
Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
(et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
de précision).
float = 24 bits de précision
double = 53 bits de précision
(à cause du bit implicite). Le 1.7 est un double, converti en float;
c'est différent de 1.7f (ici, le résultat est le même, mais il peut
y avoir des différences). Dans la pratique, cela peut être encore
plus complexe.
Dans l'article <4bafbb44$0$16460$,
Samuel DEVULDER écrit:Emmanuel a écrit :> int main(void) {
> float x;
> x = 1.7;
> return ((x + 0.1) == 1.8) ? 1 : 0;
> }
>
> j'obtiens :
>
> $ gcc -Wall -o essai essai.c; ./essai; echo $?
> 0Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
(et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
de précision).
float = 24 bits de précision
double = 53 bits de précision
(à cause du bit implicite). Le 1.7 est un double, converti en float;
c'est différent de 1.7f (ici, le résultat est le même, mais il peut
y avoir des différences). Dans la pratique, cela peut être encore
plus complexe.
In article <20100330214159$,
Vincent Lefevre wrote:
>Dans l'article <4bafbb44$0$16460$,
> Samuel DEVULDER écrit:
>
>> Emmanuel a écrit :
>
>> > int main(void) {
>> > float x;
>> > x = 1.7;
>> > return ((x + 0.1) == 1.8) ? 1 : 0;
>> > }
>> >
>> > j'obtiens :
>> >
>> > $ gcc -Wall -o essai essai.c; ./essai; echo $?
>> > 0
>
>> Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
>> (et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
>> de précision).
>
>float = 24 bits de précision
>double = 53 bits de précision
Meme pas.
>(à cause du bit implicite). Le 1.7 est un double, converti en float;
>c'est différent de 1.7f (ici, le résultat est le même, mais il peut
>y avoir des différences). Dans la pratique, cela peut être encore
>plus complexe.
Je pense qu'il convient ici de mentionner que ca peut etre encore plus
la merde, en particulier sur les architectures intel, ou la precision
des nombres stockes en memoire (double sur 8 octets) est differente de la
precisions des registres flottants (80 bits...). Du coup, la plupart des
compilo optimisants font des choses tres perturbantes. Rajouter un petit
bout de calcul quelque part *peut* influencer un calcul proche (hop, une
variable en trop, et hop, un spilled register, qui te fait passer une
valeur de 80 bits a 64 bits). Et bien evidemment, en l'absence de spilled
register, un compilo en mode optimisation brutale ne va pas arrondir les
valeurs de 80 bits a 64 bits tant qu'il reste dans les registres flottants.
In article <20100330214159$061c@prunille.vinc17.org>,
Vincent Lefevre <vincent-news@vinc17.net> wrote:
>Dans l'article <4bafbb44$0$16460$426a74cc@news.free.fr>,
> Samuel DEVULDER <samuel-dot-devulder@laposte-dot-com> écrit:
>
>> Emmanuel a écrit :
>
>> > int main(void) {
>> > float x;
>> > x = 1.7;
>> > return ((x + 0.1) == 1.8) ? 1 : 0;
>> > }
>> >
>> > j'obtiens :
>> >
>> > $ gcc -Wall -o essai essai.c; ./essai; echo $?
>> > 0
>
>> Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
>> (et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
>> de précision).
>
>float = 24 bits de précision
>double = 53 bits de précision
Meme pas.
>(à cause du bit implicite). Le 1.7 est un double, converti en float;
>c'est différent de 1.7f (ici, le résultat est le même, mais il peut
>y avoir des différences). Dans la pratique, cela peut être encore
>plus complexe.
Je pense qu'il convient ici de mentionner que ca peut etre encore plus
la merde, en particulier sur les architectures intel, ou la precision
des nombres stockes en memoire (double sur 8 octets) est differente de la
precisions des registres flottants (80 bits...). Du coup, la plupart des
compilo optimisants font des choses tres perturbantes. Rajouter un petit
bout de calcul quelque part *peut* influencer un calcul proche (hop, une
variable en trop, et hop, un spilled register, qui te fait passer une
valeur de 80 bits a 64 bits). Et bien evidemment, en l'absence de spilled
register, un compilo en mode optimisation brutale ne va pas arrondir les
valeurs de 80 bits a 64 bits tant qu'il reste dans les registres flottants.
In article <20100330214159$,
Vincent Lefevre wrote:
>Dans l'article <4bafbb44$0$16460$,
> Samuel DEVULDER écrit:
>
>> Emmanuel a écrit :
>
>> > int main(void) {
>> > float x;
>> > x = 1.7;
>> > return ((x + 0.1) == 1.8) ? 1 : 0;
>> > }
>> >
>> > j'obtiens :
>> >
>> > $ gcc -Wall -o essai essai.c; ./essai; echo $?
>> > 0
>
>> Attention, le 1.7 de x est un float ici (23bits de précision), et le 0.1
>> (et le 1.8) de l'addition (ou de la comparaison) est un double (52bits
>> de précision).
>
>float = 24 bits de précision
>double = 53 bits de précision
Meme pas.
>(à cause du bit implicite). Le 1.7 est un double, converti en float;
>c'est différent de 1.7f (ici, le résultat est le même, mais il peut
>y avoir des différences). Dans la pratique, cela peut être encore
>plus complexe.
Je pense qu'il convient ici de mentionner que ca peut etre encore plus
la merde, en particulier sur les architectures intel, ou la precision
des nombres stockes en memoire (double sur 8 octets) est differente de la
precisions des registres flottants (80 bits...). Du coup, la plupart des
compilo optimisants font des choses tres perturbantes. Rajouter un petit
bout de calcul quelque part *peut* influencer un calcul proche (hop, une
variable en trop, et hop, un spilled register, qui te fait passer une
valeur de 80 bits a 64 bits). Et bien evidemment, en l'absence de spilled
register, un compilo en mode optimisation brutale ne va pas arrondir les
valeurs de 80 bits a 64 bits tant qu'il reste dans les registres flottants.