0.1 en base 2 et comportement de bc
Le
Olivier

Bonjour,
je ne comprends le comportement de la commande bc qui me sert à convertir
en base2. En principe l'écriture en base2 de 0.1 est infinie et doit être
la même que pour 1/10. Alors pourquoi bc me répond 0,0001 qd je tape 0.1 ?
voici la copie écran de ce que me communique bc :
obase=2
0.1
.0001
1/10
0
scale0
1/10 .000110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
11001100110011001100110011001100110011001100110011001100110011
0.1
.0001
je suis perplexe : qu'est ce qui m'échappe ? merci pour vos lumières.
--
Olivier
je ne comprends le comportement de la commande bc qui me sert à convertir
en base2. En principe l'écriture en base2 de 0.1 est infinie et doit être
la même que pour 1/10. Alors pourquoi bc me répond 0,0001 qd je tape 0.1 ?
voici la copie écran de ce que me communique bc :
obase=2
0.1
.0001
1/10
0
scale0
1/10 .000110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
1100110011001100110011001100110011001100110011001100110011001100
11001100110011001100110011001100110011001100110011001100110011
0.1
.0001
je suis perplexe : qu'est ce qui m'échappe ? merci pour vos lumières.
--
Olivier
Un bug d'optimisation, à mon avis. Lorsque ibase = obase, tu n'as pas
besoin de plus de chiffres pour afficher un nombre que tu n'en as eu
besoin pour le saisir.
Suivent quelques autres tests. J'utilise bc -l pour le test avec
la fonction sinus (s(0)).
$ bc -l
obase=2
0.1
.0001
0.10
.0001100
0.100
.0001100110
0.1000
.00011001100110
0.1 + 0
.0001
0.1 + s(0)
.0001100110011001100110011001100110011001100110011001100110011001100
0.1 / 1
.0001100110011001100110011001100110011001100110011001100110011001100
1/10 - 0.1
0
Note que le moyen le plus simple que j'ai trouvé pour lui faire
afficher tous les chiffres autorisés par scale, c'est de diviser
par 1 (ajouter ou soustraire 0 ne change rien, multiplier par 1
non plus).
$ bc
obase=2
scale
0.1 + 0
.0001
0.1 - 0
.0001
0.1 * 1
.0001
0.1 / 1
.0001100110011001100110011001100110011001100110011001100110011001100
--
Olivier Miakinen
Un autre test amusant :
$ bc
obase=2
scale
a = 0
b = 0/1
0.1 + a
.0001
0.1 + b
.0001100110011001100110011001100110011001100110011001100110011001100
Et donc, le 0 qui est dans b a plus de chiffres que celui qui est
dans a !
ça m'embête un peu ces "bug d'optimisation" : peut-on avoir confiance en
bc ??
Oui : à condition de diviser par 1.
--
Olivier
Le 21/05/2014 08:38, Olivier Miakinen a écrit :
Non, c'est conforme à la spec. Le paramètre scale, c'est pour les divisions,
rien d'autre. Les nombres écrits directement, c'est le nombre de chiffres
écrits explicitement qui définit l'échelle, et les calculs sont toujours
faits en décimal.
"c'est le nombre de chiffre écrits qui définit l'échelle..."
Je ne suis pas sûr de comprendre ...
--
Olivier
Chaque expression calculée par bc a une échelle, qui détermine la précision
des calculs quand ce n'est pas exact. L'échelle d'un nombre écrit tel quel
est simplement le nombre de chiffres écrits après la virgule, si c'est en
décimal. L'échelle d'une division, c'est le paramètre scale. Tu peux essayer
par exemple :
scale(1)
scale(1.000)
scale(1/1)
scaleB
scale(1/1)