BC - multiplication automatique de haute précision

10

Élevé, je dois tester ma calculatrice de précision arbitraire, et bcsemble être un bon critère de comparaison, cependant, bctronque le résultat de chaque multiplication à ce qui semble être l'échelle maximale des opérandes impliqués chacun.

Existe-t-il un moyen rapide de désactiver cette fonction ou de régler automatiquement l'échelle de chaque multiplication sur la somme des échelles des facteurs afin qu'elle ne perde aucune précision?

Si vous avez une solution plus élégante à cela impliquant autre chose que bc, je vous serais reconnaissant de la partager.

Exemple:

$ bc <<< '1.5 * 1.5'
2.2

La vraie réponse est 2,25.

PSkocik
la source
Étroitement lié au fonctionnement de Float avec bc? .
manatwork

Réponses:

12

Vous pouvez contrôler l'échelle qui bcsort avec l' scale=<#>argument.

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

En utilisant votre exemple:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

Vous pouvez également utiliser le -lcommutateur (grâce à @manatwork) qui initialisera l'échelle à 20 au lieu de la valeur par défaut de 0. Par exemple:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

Vous pouvez en savoir plus sur scalela bcpage de manuel .

slm
la source
5
Ou moins: bc -l. " -L (La lettre ell.) Définit les fonctions mathématiques et initialise l'échelle à 20, au lieu du zéro par défaut" - bcspécification
manatwork
@manatwork - merci, je n'ai pas remarqué ce changement.
slm
Merci. Je suppose que je pourrais définir l'échelle à 2147483647 (qui se trouve être égale à INT_MAX), ce qui me dit que bc est la valeur d'échelle maximale que je peux définir (je suis allé si loin dans mes tests), mais je suppose que je Je le testerai uniquement avec des nombres entiers et offrira à bc les avantages de performance qui découlent de l'utilisation de nombres de longueur dynamique.
PSkocik
1
Pour la multiplication bc, l'échelle du résultat est exactement min(max(sx,sy,scale),sx+sy)sxet sysont les échelles de xet yen x*y. Le réglage scale=scale(x)+scale(y)donnera la précision maximale nécessaire. Régler l'échelle sur un nombre plus élevé (comme un 1000) n'augmentera pas l'échelle du résultat. La variable d'échelle n'affecte que s directement le résultat de la division scale=1000; a/1créera un résultat avec 1000 chiffres décimaux (après le point), quelle que soit l'échelle d'un avant.
Isaac
1

Essaye ça :

$ bc
scale=10
1.5 * 1.5
2.25

Recherche l'homme de BC pour la variable d'échelle

DavAlPi
la source
0

J'ai créé cette fonction bash qui n'affichera pas de zéros à la fin

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

Exemple: calc 1.25^3= 1,953125

Vartan
la source