Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
$ run a.out
a232235520.00 3232235520.00
$
Alors, spécificité de VMS ou alors j'ai raté quelque chos e ?
$ run a.out
a=3232235520.00 3232235520.00
$
Alors, spécificité de VMS ou alors j'ai raté quelque chos e ?
$ run a.out
a232235520.00 3232235520.00
$
Alors, spécificité de VMS ou alors j'ai raté quelque chos e ?
unsigned int a = 3232235530U;
unsigned int a = 3232235530U;
unsigned int a = 3232235530U;
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
a écrit dans le message de news:unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
<rixed@apc.happyleptic.org> a écrit dans le message de news:
slrnhakq0v.an5.rixed@apc.happyleptic.org...
unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
a écrit dans le message de news:unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
a écrit :Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Très amusant en effet. Chez moi, changer float en double ne produit plus
l'anomalie constatée. Le fait que a soit non signé n'a pas de rôle. J'ai
essayé de trouver une valeur minimale pour a et qui affiche des valeurs
différentes et j'ai trouvé 16777217 qui est, comme par hasard 2**24+1.
#include <stdio.h>
int main(void)
{
int a777225;
float u=a;
printf("%f %fn", u, (double) a);
return 0;
}
qui affiche
$ gcc -stdÉ9 -o x fclc.c
$ ./x
16777216.000000 16777217.000000
Mais pour 2**24+2, pas de problème. Il s'agit sans doute d'un problème de
représentation exacte d'un entier en flottant mais je ne sais en dire plus.
Est-ce que ce serait en rapport avec cet extrait de la Norme
6.3.1.3 Signed and unsigned integers
(...)
When a value of integer type is converted to a real floating type, if the
value being converted can be represented exactly in the new type, it is
unchanged. If the value being converted is in the range of values that can be
represented but cannot be represented exactly, the result is either the
nearest higher or nearest lower representable value, chosen in an
implementation-defined manner.
rixed@apc.happyleptic.org a écrit :
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Très amusant en effet. Chez moi, changer float en double ne produit plus
l'anomalie constatée. Le fait que a soit non signé n'a pas de rôle. J'ai
essayé de trouver une valeur minimale pour a et qui affiche des valeurs
différentes et j'ai trouvé 16777217 qui est, comme par hasard 2**24+1.
#include <stdio.h>
int main(void)
{
int a777225;
float u=a;
printf("%f %fn", u, (double) a);
return 0;
}
qui affiche
$ gcc -stdÉ9 -o x fclc.c
$ ./x
16777216.000000 16777217.000000
Mais pour 2**24+2, pas de problème. Il s'agit sans doute d'un problème de
représentation exacte d'un entier en flottant mais je ne sais en dire plus.
Est-ce que ce serait en rapport avec cet extrait de la Norme
6.3.1.3 Signed and unsigned integers
(...)
When a value of integer type is converted to a real floating type, if the
value being converted can be represented exactly in the new type, it is
unchanged. If the value being converted is in the range of values that can be
represented but cannot be represented exactly, the result is either the
nearest higher or nearest lower representable value, chosen in an
implementation-defined manner.
a écrit :Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur.
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça vous
amusera autant que nous.
Très amusant en effet. Chez moi, changer float en double ne produit plus
l'anomalie constatée. Le fait que a soit non signé n'a pas de rôle. J'ai
essayé de trouver une valeur minimale pour a et qui affiche des valeurs
différentes et j'ai trouvé 16777217 qui est, comme par hasard 2**24+1.
#include <stdio.h>
int main(void)
{
int a777225;
float u=a;
printf("%f %fn", u, (double) a);
return 0;
}
qui affiche
$ gcc -stdÉ9 -o x fclc.c
$ ./x
16777216.000000 16777217.000000
Mais pour 2**24+2, pas de problème. Il s'agit sans doute d'un problème de
représentation exacte d'un entier en flottant mais je ne sais en dire plus.
Est-ce que ce serait en rapport avec cet extrait de la Norme
6.3.1.3 Signed and unsigned integers
(...)
When a value of integer type is converted to a real floating type, if the
value being converted can be represented exactly in the new type, it is
unchanged. If the value being converted is in the range of values that can be
represented but cannot be represented exactly, the result is either the
nearest higher or nearest lower representable value, chosen in an
implementation-defined manner.
a écrit dans le message de news:unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
<rixed@apc.happyleptic.org> a écrit dans le message de news:
slrnhakq0v.an5.rixed@apc.happyleptic.org...
unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
a écrit dans le message de news:unsigned int a = 3232235530U;
pour moi c'est interdit de faire ça, ce nombre
ne rentre pas dans la plage garantie
de 0 à 65 535 ...
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur .
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça v ous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur .
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça v ous
amusera autant que nous.
Petit exercice amusant :
comprendre pourquoi ce programme n'affiche pas deux fois la même valeur .
#include <stdio.h>
int main(void)
{
unsigned int a = 3232235530U;
float value = a;
printf("a=%.2f %.2fn", (float)a, value);
return 0;
}
Ca nous a bien occupé une demi heure aujourd'hui, j'espère que ça v ous
amusera autant que nous.
Stephane Legras-Decussy a écrit :
> a écrit dans le message de news:
>
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
Tu n'as pas d'overflow avec des unsigned. Et de toute façon je crois qu e le
problème posé par le PO resterait le même avec un type unsigned lon g int.
Stephane Legras-Decussy a écrit :
> <ri...@apc.happyleptic.org> a écrit dans le message de news:
> slrnhakq0v.an5.ri...@apc.happyleptic.org...
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
Tu n'as pas d'overflow avec des unsigned. Et de toute façon je crois qu e le
problème posé par le PO resterait le même avec un type unsigned lon g int.
Stephane Legras-Decussy a écrit :
> a écrit dans le message de news:
>
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
Tu n'as pas d'overflow avec des unsigned. Et de toute façon je crois qu e le
problème posé par le PO resterait le même avec un type unsigned lon g int.
Le 11/09/2009 22:53, Stephane Legras-Decussy a écrit :
> a écrit dans le message de news:
>
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
En quoi c'est interdit ?
Si l'on doit se conformer strictement aux valeurs minimales de la norme
on ne programme plus grand chose.
Le 11/09/2009 22:53, Stephane Legras-Decussy a écrit :
> <ri...@apc.happyleptic.org> a écrit dans le message de news:
> slrnhakq0v.an5.ri...@apc.happyleptic.org...
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
En quoi c'est interdit ?
Si l'on doit se conformer strictement aux valeurs minimales de la norme
on ne programme plus grand chose.
Le 11/09/2009 22:53, Stephane Legras-Decussy a écrit :
> a écrit dans le message de news:
>
>> unsigned int a = 3232235530U;
> pour moi c'est interdit de faire ça, ce nombre
> ne rentre pas dans la plage garantie
> de 0 à 65 535 ...
En quoi c'est interdit ?
Si l'on doit se conformer strictement aux valeurs minimales de la norme
on ne programme plus grand chose.