Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

debain, Glib et round() => comportement bizarre sous sarge gLib 2.3.2

1 réponse
Avatar
Yann Cohen
--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Bonjour,

Je rentre d'une mise en service d'une nouvelle version soft sur une
ancienne plate forme debian sous sarge et je me suis rendu compte que
sur cette version j'avais des comportements inattendus lors des calculs
et de l'utilisation de la fonction round() de la biblioth=C3=A8que
math=C3=A9matique.

J'ai donc r=C3=A9alis=C3=A9 un petit programme de test de la fonction round
(round.c)

et je l'ai fait fonctionner sur trois cibles diff=C3=A9rentes : la cible
sarge, une cible lenny et ma station en sid.

le comportement est uniquement diff=C3=A9rent sur la version sarge o=C3=B9 :
round(0) retourne autre chose que 0 et qu'apr=C3=A8s quelque utilisation de
round la variable n n'est plus reconnue comme un double.

Je ne vois pas o=C3=B9 pourrait =C3=AAtre la diff=C3=A9rence ou la "mauvaise
utilisation" de round().

Je n'ai pas trouv=C3=A9 non plus de point d'entr=C3=A9e sur la glib pour ro=
und(),
mais l=C3=A0 je ne suis pas s=C3=BBr d'avoir bien cherch=C3=A9.

Est-ce quelqu'un a d=C3=A9j=C3=A0 rencontr=C3=A9 ce type de probl=C3=A8me ?

Bien entendu, la mise =C3=A0 jour de la cible n'est pas une option viable
pour pleins de mauvaises raisons bien terre =C3=A0 terre !

Merci d'avance.

En pi=C3=A8ces jointes :
- round.c le programme simple de test
- test.sh le srcipt de test execut=C3=A9 sur chaque cible,
- sid.txt r=C3=A9sultat sur sid
- lenny.txt r=C3=A9sultat sur lenny
- sarge.txt r=C3=A9sultat sur sarge

--
Yann COHEN

--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename=lenny.txt

uname
Linux lenny 2.6.26-2-486 #1 Tue Mar 9 17:10:34 UTC 2010 i686 GNU/Linux

glibc
GNU C Library stable release version 2.7, by Roland McGrath et al.

Compilation
round.c: In function =E2=80=98main=E2=80=99:
round.c:14: warning: incompatible implicit declaration of built-in function=
=E2=80=98round=E2=80=99

Sans utilisation de round()
-0.0000/2.0000=3D-0.0000
0.0010/2.0000=3D0.5000
0.0020/2.0000=3D1.0000
0.0030/2.0000=3D1.5000
0.0040/2.0000=3D2.0000
0.0050/2.0000=3D2.5000
0.0060/2.0000=3D3.0000
0.0070/2.0000=3D3.5000
0.0080/2.0000=3D4.0000
0.0090/2.0000=3D4.5000
0.0100/2.0000=3D5.0000
0.0110/2.0000=3D5.5000
0.0120/2.0000=3D6.0000
0.0130/2.0000=3D6.5000
0.0140/2.0000=3D7.0000
0.0150/2.0000=3D7.5000
0.0160/2.0000=3D8.0000
0.0170/2.0000=3D8.5000
0.0180/2.0000=3D9.0000
0.0190/2.0000=3D9.5000

Avec utilisation de round()
-0.0000/2.0000=3D-0.0000 round(-0.0000 0)
0.0010/2.0000=3D0.5000 round(1.0000 1)
0.0020/2.0000=3D1.0000 round(1.0000 1)
0.0030/2.0000=3D1.5000 round(2.0000 2)
0.0040/2.0000=3D2.0000 round(2.0000 2)
0.0050/2.0000=3D2.5000 round(3.0000 3)
0.0060/2.0000=3D3.0000 round(3.0000 3)
0.0070/2.0000=3D3.5000 round(4.0000 4)
0.0080/2.0000=3D4.0000 round(4.0000 4)
0.0090/2.0000=3D4.5000 round(5.0000 5)
0.0100/2.0000=3D5.0000 round(5.0000 5)
0.0110/2.0000=3D5.5000 round(6.0000 6)
0.0120/2.0000=3D6.0000 round(6.0000 6)
0.0130/2.0000=3D6.5000 round(7.0000 7)
0.0140/2.0000=3D7.0000 round(7.0000 7)
0.0150/2.0000=3D7.5000 round(8.0000 8)
0.0160/2.0000=3D8.0000 round(8.0000 8)
0.0170/2.0000=3D8.5000 round(9.0000 9)
0.0180/2.0000=3D9.0000 round(9.0000 9)
0.0190/2.0000=3D9.5000 round(10.0000 10)

--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: text/x-csrc
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=round.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

main(int argc, char *argv[])
{
double n, d=2, q, r;
int nb = 20;

while(nb--) {
q = n / d * 1E3;
printf("%.4lf/%.4lf=%.4lf", n, d, q);
if (argc > 1) {
r = round(q);
printf(" round(%.4lf %ld)", r, (long)r);
}
printf("\n", r, (long)r);
n += 0.001;
//d *= 1.3;
}
}

--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=sarge.txt

uname
Linux sarge 2.6.8-2-386 #1 Tue Aug 16 12:46:35 UTC 2005 i686 GNU/Linux

glibc
GNU C Library stable release version 2.3.2, by Roland McGrath et al.

Compilation

Sans utilisation de round()
0.0000/2.0000=0.0000
0.0010/2.0000=0.5000
0.0020/2.0000=1.0000
0.0030/2.0000=1.5000
0.0040/2.0000=2.0000
0.0050/2.0000=2.5000
0.0060/2.0000=3.0000
0.0070/2.0000=3.5000
0.0080/2.0000=4.0000
0.0090/2.0000=4.5000
0.0100/2.0000=5.0000
0.0110/2.0000=5.5000
0.0120/2.0000=6.0000
0.0130/2.0000=6.5000
0.0140/2.0000=7.0000
0.0150/2.0000=7.5000
0.0160/2.0000=8.0000
0.0170/2.0000=8.5000
0.0180/2.0000=9.0000
0.0190/2.0000=9.5000

Avec utilisation de round()
0.0000/2.0000=0.0000 round(32.0000 32)
0.0010/2.0000=0.5000 round(14368.0000 14368)
0.0020/2.0000=1.0000 round(0.0000 0)
0.0030/2.0000=1.5000 round(534560.0000 534560)
0.0040/2.0000=2.0000 round(0.0000 0)
0.0050/2.0000=2.5000 round(268320.0000 268320)
0.0060/2.0000=3.0000 round(0.0000 0)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)
nan/2.0000=nan round(2047.0000 2047)

--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=sid.txt

uname
Linux yan 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 x86_64 GNU/Linux

glibc
GNU C Library (Debian EGLIBC 2.11.2-11) stable release version 2.11.2, by Roland McGrath et al.

Compilation

Sans utilisation de round()
0.0000/2.0000=0.0000
0.0010/2.0000=0.5000
0.0020/2.0000=1.0000
0.0030/2.0000=1.5000
0.0040/2.0000=2.0000
0.0050/2.0000=2.5000
0.0060/2.0000=3.0000
0.0070/2.0000=3.5000
0.0080/2.0000=4.0000
0.0090/2.0000=4.5000
0.0100/2.0000=5.0000
0.0110/2.0000=5.5000
0.0120/2.0000=6.0000
0.0130/2.0000=6.5000
0.0140/2.0000=7.0000
0.0150/2.0000=7.5000
0.0160/2.0000=8.0000
0.0170/2.0000=8.5000
0.0180/2.0000=9.0000
0.0190/2.0000=9.5000

Avec utilisation de round()
0.0000/2.0000=0.0000 round(0.0000 0)
0.0010/2.0000=0.5000 round(1.0000 1)
0.0020/2.0000=1.0000 round(1.0000 1)
0.0030/2.0000=1.5000 round(2.0000 2)
0.0040/2.0000=2.0000 round(2.0000 2)
0.0050/2.0000=2.5000 round(3.0000 3)
0.0060/2.0000=3.0000 round(3.0000 3)
0.0070/2.0000=3.5000 round(4.0000 4)
0.0080/2.0000=4.0000 round(4.0000 4)
0.0090/2.0000=4.5000 round(5.0000 5)
0.0100/2.0000=5.0000 round(5.0000 5)
0.0110/2.0000=5.5000 round(6.0000 6)
0.0120/2.0000=6.0000 round(6.0000 6)
0.0130/2.0000=6.5000 round(7.0000 7)
0.0140/2.0000=7.0000 round(7.0000 7)
0.0150/2.0000=7.5000 round(8.0000 8)
0.0160/2.0000=8.0000 round(8.0000 8)
0.0170/2.0000=8.5000 round(9.0000 9)
0.0180/2.0000=9.0000 round(9.0000 9)
0.0190/2.0000=9.5000 round(10.0000 10)

--MP_/yaH6BqwuC.F6dtiGXlX7cVS
Content-Type: application/x-shellscript
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=test.sh

IyEvYmluL3NoCgplY2hvICJ1bmFtZSIKdW5hbWUgLWEgCgplY2hvICIiCmVjaG8gImdsaWJjIgov
bGliL2xpYmMuc28uNiB8IGhlYWQgLTEKCmVjaG8gIiIKZWNobyAiQ29tcGlsYXRpb24iCmNjIHJv
dW5kLmMgLWwgbSAtbyByb3VuZAoKZWNobyAiIgplY2hvICJTYW5zIHV0aWxpc2F0aW9uIGRlIHJv
dW5kKCkiCi4vcm91bmQKCmVjaG8gIiIKZWNobyAiQXZlYyB1dGlsaXNhdGlvbiBkZSByb3VuZCgp
IgouL3JvdW5kIHRvdG8KCg==

--MP_/yaH6BqwuC.F6dtiGXlX7cVS--

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org
Archive: http://lists.debian.org/20110403183350.0a409a45@yan.ianco.homelinux.org

1 réponse

Avatar
Yann Cohen
Bonjour,

Pb de version de gcc et de dialecte C => -std=gnu99 et round
fonctionne !

Yann.
Le Sun, 3 Apr 2011 18:33:50 +0200,
Yann Cohen a écrit :

Bonjour,

Je rentre d'une mise en service d'une nouvelle version soft sur une
ancienne plate forme debian sous sarge et je me suis rendu compte que
sur cette version j'avais des comportements inattendus lors des
calculs et de l'utilisation de la fonction round() de la bibliothèque
mathématique.

J'ai donc réalisé un petit programme de test de la fonction rou nd
(round.c)

et je l'ai fait fonctionner sur trois cibles différentes : la cible
sarge, une cible lenny et ma station en sid.

le comportement est uniquement différent sur la version sarge oà ¹ :
round(0) retourne autre chose que 0 et qu'après quelque utilisation de
round la variable n n'est plus reconnue comme un double.

Je ne vois pas où pourrait être la différence ou la "mauva ise
utilisation" de round().

Je n'ai pas trouvé non plus de point d'entrée sur la glib pour
round(), mais là je ne suis pas sûr d'avoir bien cherché.

Est-ce quelqu'un a déjà rencontré ce type de problème ?

Bien entendu, la mise à jour de la cible n'est pas une option viable
pour pleins de mauvaises raisons bien terre à terre !

Merci d'avance.

En pièces jointes :
- round.c le programme simple de test
- test.sh le srcipt de test executé sur chaque cible,
- sid.txt résultat sur sid
- lenny.txt résultat sur lenny
- sarge.txt résultat sur sarge

--
Yann COHEN



--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/