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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #26144962
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
Olivier Miakinen
Le #26144952
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 !
stalker5
Le #26145812
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 !

Nicolas George
Le #26145832
Olivier Miakinen , dans le message
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.
stalker5
Le #26146492

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
Nicolas George
Le #26146572
stalker5 , dans le message é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)
Publicité
Poster une réponse
Anonyme