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

0.1 en base 2 et comportement de bc

Aucune réponse
Avatar
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
scale=100
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

6 réponses

Avatar
Olivier Miakinen
Le 21/05/2014 01:34, Olivier a écrit :

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 ?



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.

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.



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
Avatar
Olivier Miakinen
Le 21/05/2014 08:32, j'écrivais :

$ bc
obase=2
scale
0.1 + 0
.0001
0.1 - 0
.0001
0.1 * 1
.0001
0.1 / 1
.0001100110011001100110011001100110011001100110011001100110011001100



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 !
Avatar
stalker5
Merci pour ta réponse rapide.
ç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 :
Le 21/05/2014 08:32, j'écrivais :

$ bc
obase=2
scale
0.1 + 0
.0001
0.1 - 0
.0001
0.1 * 1
.0001
0.1 / 1
.0001100110011001100110011001100110011001100110011001100110011001100



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 !

Avatar
Nicolas George
Olivier Miakinen , dans le message <llhha6$1fal$,
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.



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.
Avatar
stalker5

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
Avatar
Nicolas George
stalker5 , dans le message <lliih5$4f0$, a
écrit :
"c'est le nombre de chiffre écrits qui définit l'échelle..."

Je ne suis pas sûr de comprendre ...



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)