bc
Table des matières
Retour à l'index
NOM
bc – Un langage de calculatrice à précision arbitraire
SYNTAXE
bc [ -hlwsqv ] [options_longues] [ fichier ... ]
DESCRIPTION
bc est un langage qui prend en charge les nombres en précision arbitraire
ainsi qu'une exécution interactive des instructions. Il y a quelques
similitudes au niveau de la syntaxe avec le langage de programmation C. Une
bibliothèque mathématique standard est disponible à l’aide d’options de
ligne de commande. Si nécessaire, la bibliothèque mathématique peut être
définie avant de prendre en compte le moindre fichier. bc démarre en
traitant le code de tous les fichiers listés sur la ligne de commande dans
leur ordre d'apparition. Après que tous les fichiers ont été traités, bc
lit à partir de l'entrée standard. Tout le code est exécuté dès qu'il est lu
(si un fichier contient une commande indiquant d'arrêter le processeur,
bc ne lira jamais à partir de l'entrée standard).
Cette version de bc contient plusieurs extensions en sus des
implémentations traditionnelles de bc et du document de travail de la
norme POSIX. Les options de ligne de commande peuvent faire afficher un
avertissement par ces extensions ou les rejeter. Ce document décrit le
langage accepté par ce processeur. Les extensions seront considérées selon
cela.
OPTIONS
- -h, --help
-
Afficher ce message et quitter.
- -i, --interactive
-
Forcer le mode interactif.
- -l, --mathlib
-
Définir la bibliothèque mathématique standard.
- -w, --warn
-
Émettre des avertissements pour les extensions du bc POSIX.
- -s, --standard
-
Utiliser exactement le langage bc POSIX.
- -q, --quiet
-
Ne pas afficher le message normal de bienvenue de GNU bc.
- -V, --version
-
Afficher le numéro de version et le copyright et quitter.
NOMBRES
L'élément le plus basique dans bc est le nombre. Les nombres sont des
nombres en précision arbitraire. Cette précision vaut à la fois pour la
partie entière et pour la partie fractionnaire. Tous les nombres sont
représentés de façon interne en décimal et tous les calculs sont effectués
en décimal (cette version tronque les résultats des opérations de division
et de multiplication). Les nombres ont deux attributs : la longueur et
l'échelle. La longueur est le nombre total de chiffres décimaux utilisés par
bc pour représenter un nombre et l'échelle est le nombre total de
chiffres décimaux après le point décimal. Par exemple :
- .000001 a une longueur de 6 et une échelle de 6.
1935.000 a une longueur de 7 et une échelle de 3.
VARIABLES
Les nombres sont stockés dans deux types de variables : les variables
simples et les variables de tableau. Toutes deux sont nommées. Les noms
commencent par une lettre suivie d'un nombre quelconque de lettres, de
chiffres ou de caractères de soulignement (« _ »). Toutes les lettres
doivent être en minuscule. Les noms entièrement alphanumériques sont une
extension. Dans le bc POSIX, tous les noms sont constitués d'une seule
lettre minuscule. Le type de variable est rendu évident grâce au contexte,
car tous les noms de variables de tableau sont suivis de crochets ([]).
Il y a quatre variables spéciales : scale, ibase, obase et
last. scale définit la façon dont certaines opérations utilisent les
chiffres après le point décimal. La valeur par défaut pour scale
est 0. ibase et obase définissent la base de conversion pour les
nombres en entrée et en sortie. La base par défaut est 10, que ce soit pour
l'entrée ou pour la sortie. last (une extension) est une variable ayant
pour valeur le dernier nombre affiché. Ces variables seront commentées plus
en détail quand cela sera approprié. Toutes ces variables peuvent se voir
affecter des valeurs et être utilisées dans des expressions.
COMMENTAIRES
Les commentaires dans bc débutent par les caractères /* et se
terminent par les caractères */. Les commentaires peuvent démarrer
n'importe où et apparaître comme une simple espace en entrée. Cela conduit
les commentaires à délimiter les autres éléments de l'entrée. Par exemple,
un commentaire ne peut être trouvé au milieu d'un nom de variable. Les
commentaires incluent tous les sauts de ligne (fin de ligne) situés entre le
début et la fin du commentaire.
Pour que bc prenne en charge l'utilisation de scripts, un commentaire
d'une seule ligne a été ajouté comme extension. Un commentaire d'une seule
ligne débute par un caractère # et continue jusqu'à la fin de la
ligne. Le caractère de fin de ligne ne fait pas partie du commentaire et est
traité normalement.
EXPRESSIONS
Les nombres sont manipulés par des expressions et des instructions. Puisque
le langage a été conçu pour être interactif, les instructions et les
expressions sont exécutées le plus tôt possible. Il n'y a pas de programme
« main ». Au lieu de cela, le code est exécuté dès qu'il est rencontré. Les
fonctions, expliquées en détail ci-après, sont définies quand elles sont
rencontrées.
Une expression simple est simplement une constante. bc convertit les
constantes en nombres décimaux internes en utilisant la base courante de
l’entrée courante, spécifiée par la variable ibase. Une exception existe
pour les fonctions. Les valeurs valables pour ibase vont de 2 à 36,
celles supérieures à 16 sont une extension. Affecter une valeur en dehors de
cet intervalle à ibase résultera en une valeur de 2 ou 36. Les nombres
d'entrée peuvent contenir les caractères 0-9 et A-F (remarque : ils doivent
être en capitales, les lettres minuscules étant des noms de variables). Les
nombres d'un seul chiffre ont toujours la valeur de ce chiffre quelle que
soit la valeur de ibase (c’est-à-dire A = 10). Pour les nombres composés
de plusieurs chiffres, bc remplace tous les chiffres d'entrée supérieurs
ou égaux à ibase par la valeur de ibase - 1. Cela fait en sorte que
le nombre ZZZ est toujours le plus grand nombre de 3 chiffres dans la
base d'entrée.
Les expressions complètes sont similaires à celles de nombreux autres
langages de haut niveau. Puisqu'il n'y a qu'un seul type de nombre, il n'y a
pas de règle pour mélanger des types. Au lieu de cela, il existe des règles
portant sur l'échelle des expressions. Chaque expression possède une
échelle. Elle est dérivée de l'échelle des nombres originaux, de l'opération
effectuée et, dans de nombreux cas, de la valeur de la variable
scale. Les valeurs valables pour la variable scale vont de 0 au plus
grand nombre représentable par un entier C.
Dans les descriptions suivantes des expressions valables, « expr » fait
référence à une expression complète, et « var » à une variable simple ou de
tableau. Une variable simple est juste un
-
nom
et une variable de tableau est indiquée par
-
nom[expr]
À moins qu'elle ne soit mentionnée spécifiquement, l'échelle du résultat est
la plus grande de celles des expressions impliquées.
- - expr
-
Le résultat de la négation de l'expression.
- ++ var
-
La variable est incrémentée de un et la nouvelle valeur est le résultat de
l'expression.
- -- var
-
La variable est décrémentée de un et la nouvelle valeur est le résultat de
l'expression.
- var ++
-
Le résultat de l'expression est la valeur de la variable
et ensuite la variable est incrémentée de un.
- var --
-
Le résultat de l'expression est la valeur de la variable et ensuite la
variable est décrémentée de un.
- expr + expr
-
Le résultat de l'expression est la somme des deux expressions.
- expr - expr
-
Le résultat de l'expression est la différence des deux expressions.
- expr * expr
-
Le résultat de l'expression est le produit des deux expressions.
- expr / expr
-
Le résultat de l'expression est le quotient des deux expressions. L'échelle
du résultat est la valeur de la variable scale.
- expr % expr
-
Le résultat de l'expression est le « reste » et il est calculé de la manière
suivante : pour calculer a%b, a/b est d'abord calculé avec une échelle de
scale chiffres. Ce résultat est utilisé pour calculer a-(a/b)*b avec
comme échelle le maximum de scale + échelle(b) et échelle(a). Si scale
vaut zéro et que les deux expressions sont des entiers, cette expression est
la fonction modulo d’entiers.
- expr ^ expr
-
Le résultat de l'expression est la valeur de l’élévation de la première
expression à une puissance égale à la valeur de la seconde expression. La
seconde expression doit être un entier. Si la seconde expression n'est pas
un entier, un avertissement est généré et l'expression est tronquée pour
obtenir une valeur entière. L'échelle du résultat est scale si l'exposant
est négatif. Si l'exposant est positif, l'échelle du résultat est le minimum
entre l'échelle de la première expression multipliée par la valeur de
l'exposant et celle maximale entre scale et l'échelle de la première
expression (par exemple, scale(a^b) = min(scale(a)*b, max(scale,
scale(a)))). Il faut noter que expr^0 renverra toujours la valeur 1.
- ( expr )
-
Cela altère la priorité standard pour forcer l'évaluation de l'expression.
- var = expr
-
La valeur de l'expression est affectée à la variable.
- var <op>= expr
-
C'est équivalent à « var = var <op> expr » excepté que la partie
« var » n'est évaluée qu'une seule fois. Cela peut faire une différence si
« var » est un tableau.
Les expressions relationnelles sont un cas particulier des expressions qui
sont toujours évaluées à 0 ou 1 : 0 si la relation est fausse et 1 si la
relation est vraie. Elles peuvent apparaître dans n'importe quelle
expression valable. Le bc POSIX requiert que les expressions
relationnelles ne soient utilisées que dans les instructions if, for et
while, et qu'un seul test relationnel y soit effectué. Les opérateurs
relationnels sont
- expr1 < expr2
-
Le résultat est 1 si expr1 est strictement inférieure à expr2.
- expr1 <= expr2
-
Le résultat est 1 si expr1 est inférieure ou égale à expr2.
- expr1 > expr2
-
Le résultat est 1 si expr1 est strictement supérieure à expr2.
- expr1 >= expr2
-
Le résultat est 1 si expr1 est supérieure ou égale à expr2.
- expr1 == expr2
-
Le résultat est 1 si expr1 est égale à expr2.
- expr1 != expr2
-
Le résultat est 1 si expr1 n'est pas égale à expr2.
Les opérations booléennes sont également valables. Le bc POSIX NE possède
PAS d’opérations booléennes. Le résultat de toutes les opérations booléennes
est 0 ou 1 (pour faux ou vrai) comme dans les expressions
relationnelles. Les opérateurs booléens sont :
- !expr
-
Le résultat est 1 si expr vaut 0.
- expr && expr
-
Le résultat est 1 si les deux expressions sont différentes de zéro.
- expr || expr
-
Le résultat est 1 si au moins l'une des deux expressions est différente de
zéro.
La priorité dans les expressions est la suivante (de la plus basse à la plus
haute) :
- opérateur ||, associatif à gauche
opérateur &&, associatif à gauche
opérateur !, non associatif
opérateurs relationnels, associatifs à gauche
opérateur d'affectation, associatif à droite
opérateurs + et - , associatifs à gauche
opérateurs *, / et %, associatifs à gauche
opérateur ^, associatif à droite
opérateur - unaire, non associatif
opérateurs ++ et --, non associatifs
Cette priorité a été choisie de telle sorte que les programmes bc
conformes à POSIX s'exécutent correctement. Cela conduira à ce que
l'utilisation des opérateurs relationnels et logiques mène à un comportement
inhabituel lors de leur utilisation dans des expressions
d'affectation. Considérez l'expression :
-
a = 3 < 5
La plupart des programmeurs C supposeraient que cela affecte le résultat de
« 3 < 5 » (la valeur 1) à la variable « a ». Dans bc, cela affecte la
valeur 3 à la variable « a » et compare ensuite 3 à 5. Il vaut mieux
utiliser des parenthèses lors de l'utilisation d'opérateurs relationnels ou
logiques en présence d'opérateurs d'affectation.
Il y a quelques expressions spéciales supplémentaires qui sont fournies dans
bc. Elles se rapportent à des fonctions définies par l'utilisateur et à
des fonctions standard. Elles apparaissent toutes sous la forme
« ,nom/(,paramètres/) ». Consulter la section sur les
fonctions pour les fonctions définies par l'utilisateur. Les fonctions
standard sont :
- length ( expression )
-
La valeur de la fonction length est le nombre de chiffres significatifs dans
l'expression.
- read ( )
-
La fonction read (une extension) lit un nombre à partir de l'entrée standard
indépendamment de l’endroit où elle est appelée. Attention : cela peut
causer des problèmes lors du mélange de données et d'un programme sur
l'entrée standard. Le meilleur usage de cette fonction se situe dans un
programme précédemment écrit qui a besoin d’une saisie de l'utilisateur,
mais qui ne permet jamais que l'utilisateur saisisse du code de
programme. La valeur de la fonction read est le nombre lu à partir de
l'entrée standard en utilisant la valeur actuelle de la variable ibase
comme base de conversion.
- scale ( expression )
-
La valeur de la fonction scale est le nombre de chiffres après le point
décimal dans l'expression.
- sqrt ( expression )
-
La valeur de la fonction sqrt est la racine carrée de l'expression. Si
l'expression est négative, une erreur d’exécution est générée.
INSTRUCTIONS
Les instructions (comme dans la plupart des langages algébriques)
fournissent l’ordre d’évaluation d'une expression. Dans bc, les
instructions sont exécutées « le plus tôt possible ». L'exécution se produit
quand un saut de ligne est rencontré et qu'il y a une ou plusieurs
instructions complètes. À cause de cette exécution immédiate, les sauts de
ligne sont très importants dans bc. En fait, le point-virgule et le saut
de ligne sont utilisés comme séparateurs d'instructions. Un saut de ligne
mal placé provoquera une erreur de syntaxe. Puisque les sauts de ligne sont
des séparateurs d'instructions, il est possible de cacher un saut de ligne
en utilisant une barre oblique inverse. La séquence « \<nl> », où
<nl> est le saut de ligne, apparaît à bc comme un espace blanc au
lieu d'un saut de ligne. Une liste d'instructions est une série
d'instructions séparées par des points-virgules et des sauts de ligne. Voici
une liste des instructions de bc et ce qu'elles font (les éléments entre
crochets ([]) sont des parties facultatives de l'instruction) :
- expression
-
Cette instruction accomplit une des deux actions. Si l'expression débute par
« <variable> <affectation> ... », elle est considérée comme
une instruction d'affectation. Si l'expression n'est pas une instruction
d'affectation, l'expression est évaluée et affichée sur la sortie. Après
l’affichage du nombre, un saut de ligne est également affiché. Par exemple,
« a=1 » est une instruction d'affectation et « (a=1) » est une expression
qui possède une affectation imbriquée. Tous les nombres qui sont affichés le
sont dans la base spécifiée par la variable obase. Les valeurs valables
pour obase vont de 2 à BC_BASE_MAX (consulter la section LIMITES). Pour
les bases 2 à 16, la méthode habituelle d'écriture des nombres est
utilisée. Pour les bases supérieures à 16, bc utilise une méthode
utilisant des chiffres multicaractères pour afficher les nombres où chaque
chiffre d'une base supérieure est affiché comme un nombre en base 10. Les
chiffres multicaractères sont séparés par des espaces. Chaque chiffre
contient le nombre de caractères requis pour représenter la valeur en base
dix de « obase - 1 ». Puisque les nombres sont en précision arbitraire,
certains nombres ne peuvent être affichés sur une seule ligne de sortie. Ces
nombres longs seront éclatés sur plusieurs lignes en utilisant « \ » comme
dernier caractère de la ligne. Le nombre maximal de caractères affichés par
ligne est 70. À cause de la nature interactive de bc, l'affichage d'un
nombre présente comme effet de bord l'affectation de la valeur affichée à la
variable spéciale last. Cela permet à l'utilisateur de récupérer la
dernière valeur affichée sans avoir à retaper l'expression qui a affiché le
nombre. Affecter une valeur à last est légal et remplacera la dernière
valeur affichée par la valeur affectée. La valeur nouvellement affectée
restera jusqu'à ce que le nombre suivant soit affiché ou qu'une autre valeur
soit affectée à last. Certaines installations peuvent permettre
l'utilisation d'un simple point (.) qui ne fait pas partie d'un nombre comme
un raccourci pour last.
- string
-
La chaîne de caractères est affichée sur la sortie. Les chaînes débutent par
un guillemet double droit et contiennent tous les caractères présents
jusqu'au guillemet suivant. Tous les caractères sont utilisés littéralement,
y compris les sauts de ligne. Aucun caractère de saut de ligne n'est imprimé
après la chaîne.
- print liste
-
L'instruction print (une extension) fournit une autre méthode de sortie. La
« liste » est une liste de chaînes et d'expressions séparées par des
virgules. Les chaînes ou expressions sont affichées dans leur ordre
d'apparition dans cette liste. Aucun saut de ligne terminal n'est
affiché. Les expressions sont évaluées et leur valeur est affichée et
affectée à la variable last. Les chaînes de l'instruction print sont
affichées sur la sortie et peuvent contenir des caractères spéciaux. Les
caractères spéciaux débutent par une barre oblique inverse (\). Les
caractères spéciaux reconnus par bc sont « a » (alerte ou sonnerie),
« b » (effacement arrière), « f » (saut de page), « n » (saut de ligne),
« r » (retour chariot), « q » (guillemet double droit), « t » (tabulation)
et « \ » (barre oblique inverse). Tout autre caractère suivant la barre
oblique inverse sera ignoré.
- { liste_instructions }
-
C'est l'instruction composée. Elle permet à plusieurs instructions d'être
regroupées pour exécution.
- if ( expression ) instruction1 [else instruction2]
-
L'instruction if évalue l'expression et exécute instruction1 ou instruction2
en fonction de la valeur de l'expression. Si l'expression est différente de
zéro, instruction1 est exécutée. Si instruction2 est présente et que la
valeur de l'expression est 0, alors instruction2 est exécutée (la clause
else est une extension).
- while ( expression ) instruction
-
L'instruction while exécutera l'instruction tant que l'expression est
différente de zéro. Elle évalue l'expression avant chaque exécution de
l'instruction. La fin de la boucle est causée par une valeur d'expression
de 0 ou par l'exécution d'une instruction break.
- for ( [expression1] ; [expression2] ; [expression3] ) instruction
-
L'instruction for contrôle l'exécution répétée de l'instruction. Expression1
est évaluée avant la boucle. Expression2 est évaluée avant chaque exécution
de l'instruction. Si elle est différente de zéro, l'instruction est
évaluée. Si c’est zéro, la boucle est terminée. Après chaque exécution de
l'instruction, expression3 est évaluée avant la réévaluation de
expression2. Si expression1 ou expression3 sont absentes, rien n'est évalué
au moment où elles devraient l'être. Si expression2 manque, cela revient à
substituer la valeur 1 à expression2. Les expressions facultatives sont une
extension. Le bc POSIX requiert les trois expressions. Le code suivant
est équivalent à l'instruction for :
- expression1;
while (expression2) {
instruction;
expression3;
}
- break
-
Cette instruction provoque un arrêt forcé de l'instruction while ou for
englobante la plus proche.
- continue
-
L'instruction continue (une extension) force l'instruction for englobante la
plus proche à commencer l'itération suivante.
- halt
-
L'instruction halt (une extension) est une instruction exécutée qui indique
au processeur bc de ne s'arrêter que lorsqu'elle est exécutée. Par
exemple, « if (0 == 1) halt » n'obligera pas bc à se terminer, car le
halt n'est pas exécuté.
- return
-
Renvoyer la valeur 0 à partir d'une fonction (consulter la section sur les
fonctions).
- return ( expression )
-
Renvoyer la valeur de l'expression à partir d'une fonction (consulter la
section sur les fonctions). Comme extension, les parenthèses ne sont pas
requises.
PSEUDO-INSTRUCTIONS
Ces instructions ne sont pas des instructions au sens traditionnel du
terme. Elles ne sont pas des instructions exécutées. Leur fonction est
effectuée au moment de la compilation.
- limits
-
Afficher les limites locales imposées par la version locale de bc. C'est
une extension.
- quit
-
Quand l'instruction quit est lue, le processeur bc est arrêté, quel que
soit l'emplacement de l'instruction quit. Par exemple, « if (0 == 1) quit »
provoquera l'arrêt de bc.
- warranty
-
Afficher une notice de garantie plus longue. C'est une extension.
FONCTIONS
Les fonctions fournissent une méthode pour définir un calcul pouvant être
exécuté ultérieurement. Les fonctions de bc calculent toujours une valeur
et la renvoient à l'appelant. Les définitions de fonction sont
« dynamiques » dans le sens où une fonction n'est pas définie avant que sa
définition ait été rencontrée en entrée. Cette définition est ensuite
utilisée jusqu'à ce qu'une définition de fonction de même nom soit
rencontrée. La nouvelle définition remplace ensuite l'ancienne. Une fonction
est définie comme suit :
- define nom ( paramètres ) { saut_de_ligne liste_auto liste_instructions }
Un appel de fonction est simplement une expression de la forme
« ,nom/(,paramètres/) ».
Les paramètres sont des nombres ou des tableaux (une extension). Dans la
définition de fonction, zéro paramètres ou plus sont définis en fournissant
leurs noms séparés par des virgules. Tous les paramètres sont passés par
valeur. Les tableaux sont spécifiés dans la définition des paramètres par la
notation « ,nom/[] ». Dans l'appel de fonction, les paramètres réels
sont des expressions complètes pour les paramètres nombres. La même notation
est utilisée pour passer des tableaux et pour définir des paramètres de
tableau. Le tableau nommé est passé par valeur à la fonction. Puisque les
définitions de fonctions sont dynamiques, le nombre de paramètres et leur
type sont vérifiés quand une fonction est appelée. Toute erreur dans le
nombre ou le type des paramètres provoquera une erreur à l'exécution. Une
erreur à l'exécution se produit également lors de l'appel d'une fonction non
définie.
La liste_auto est une liste facultative de variables destinées à une
utilisation « locale ». La syntaxe de la liste_auto (si elle est présente)
est « auto nom, ... ; », le point-virgule étant facultatif. Chaque
nom est le nom d'une variable automatique. Les tableaux peuvent être
spécifiés en utilisant la même notation que celle utilisée pour les
paramètres. Ces variables voient leur valeur empilée au début de la
fonction. Les variables sont ensuite initialisées à zéro et utilisées tout
au long de l'exécution de la fonction. À la sortie de la fonction, ces
valeurs sont dépilées afin que leur valeur originale (au moment de l'appel
de la fonction) soit restaurée. Les paramètres sont réellement des variables
automatiques qui sont initialisées à une valeur fournie dans l'appel de
fonction. Les variables automatiques sont différentes des variables locales
traditionnelles car, si une fonction A appelle une fonction B, B peut
accéder aux variables automatiques de A en utilisant simplement le même nom,
à moins que la fonction B en ait fait des variables automatiques. Étant
donné que les variables automatiques et les paramètres sont placés sur une
pile, bc prend en charge les fonctions récursives.
Le corps de la fonction est une liste d'instructions de bc. À nouveau,
les instructions sont séparées par des points-virgules ou des sauts de
ligne. Les instructions return provoquent l'arrêt d’une fonction et le
renvoi d'une valeur. Il y a deux versions de l'instruction return. La
première forme, « return », renvoie la valeur 0 à l'expression
appelante. La seconde forme, « return (expression ) », calcule la
valeur de l'expression et la renvoie à l'expression appelante. Il y a un
« return (0) » implicite à la fin de chaque fonction. Cela permet à une
fonction de se terminer et de renvoyer 0 sans avoir besoin d'une instruction
return explicite.
Les fonctions modifient également l'utilisation de la variable
ibase. Toutes les constantes dans le corps de la fonction seront
converties en utilisant la valeur de ibase au moment de l'appel de
fonction. Les changements d'ibase seront ignorés durant l'exécution de la
fonction sauf pour la fonction standard read, qui utilise toujours la
valeur actuelle de ibase pour les conversions de nombres.
Plusieurs extensions ont été ajoutées aux fonctions. D’abord, le format de
la définition a été rendu légèrement moins astreignant. La norme requiert
que l'accolade d'ouverture soit placée sur la même ligne que le mot-clé
define et que toutes les autres parties se situent sur les lignes
suivantes. Cette version de bc permet un nombre quelconque de sauts de
ligne avant et après l'accolade d'ouverture de la fonction. Par exemple, les
définitions suivantes sont valables :
- define d (n) { return (2*n); } define d (n) { return (2*n); }
Les fonctions peuvent être définies comme void. Une fonction void ne
renvoie aucune valeur et par conséquent ne peut être utilisée dans toute
place nécessitant une valeur. Une fonction void ne produit aucune sortie
lorsqu’appelée par elle-même sur une ligne d’entrée. Le mot-clé void est
placé entre le mot-clé define et le nom de fonction. Par exemple, en
considérant la session suivante :
- define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---
Puisque py n’est pas une fonction void, l’appel de py(1) affiche la
sortie désirée et une seconde ligne qui est la valeur de la
fonction. Puisque la valeur d’une fonction qui n’a pas reçu d’instruction
return explicite est zéro, celui-ci est affiché. Pour px(1), aucun zéro
n’est affiché parce que la fonction est une fonction void.
L’appel par variable a été aussi ajouté pour les tableaux. Pour déclarer un
appel par variable, la déclaration du paramètre de tableau dans la
définition de fonction ressemble à « ,*nom/[] ». L’appel de la
fonction reste le même que l’appel par tableaux de valeurs.
BIBLIOTHÈQUE MATHÉMATIQUE
Si bc est invoqué avec l'option -l, une bibliothèque mathématique est
préchargée et l'échelle par défaut est fixée à 20. Les fonctions
mathématiques calculeront leur résultat à l'échelle établie au moment de
leur appel. La bibliothèque mathématique définit les fonctions suivantes :
- s (,x/)
-
Le sinus de x ; x est exprimé en radians.
- c (,x/)
-
Le cosinus de x ; x est exprimé en radians.
- a (,x/)
-
L’arc tangente de x ; arctan renvoie des radians.
- l (,x/)
-
Le logarithme naturel (népérien) de x.
- e (,x/)
-
La fonction exponentielle de e à la puissance x.
- j (,n,x/)
-
La fonction de Bessel d’ordre entier n de x.
EXEMPLES
Dans /bin/sh, le code suivant affectera la valeur de « pi » à la variable
d’interpréteur pi.
-
pi=$(echo "scale=10; 4*a(1)" | bc -l)
Le code suivant est la définition de la fonction exponentielle utilisée dans
la bibliothèque mathématique. Cette fonction est écrite en bc POSIX.
- scale = 20
/* Utilisation du fait que e^x = (e^(x/2))^2 Quand x est suffisamment petit, la série suivante est utilisée : e^x = 1 + x + x^2/2! + x^3/3! + ... */
define e(x) { auto a, d, e, f, i, m, v, z
/* Vérification du signe de x. */ if (x<0) { m = 1 x = -x }
/* Précondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }
/* Initialisation des variables. */ v = 1+x a = x d = 1
for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } }
Le code suivant utilise les fonctionnalités avancées de bc pour
implémenter un programme simple de calcul des soldes de chéquier. Ce
programme est conservé de préférence dans un fichier pour qu'il puisse être
réutilisé à maintes reprises sans avoir à le retaper à chaque fois.
- scale=2 print "\nProgramme de chéquier !\n" print " Rappelez-vous, les dépôts sont des transactions négatives.\n" print " Quittez par une transaction 0.\n\n"
print "Solde initial ? "; bal = read() bal /= 1 print "\n" while (1) { "solde actuel = "; bal "transaction ? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit
Le code suivant est la définition de la fonction factorielle récursive :
- define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
OPTIONS READLINE ET LIBEDIT
GNU bc peut être compilé (à l’aide d’une option de configuration) pour
utiliser soit la bibliothèque d'éditeur d'entrée GNU readline, soit la
bibliothèque BSD libedit. Cela permet à l'utilisateur d'éditer des lignes
avant de les envoyer à bc. Cela permet également un historique des lignes
précédemment tapées. Quand cette option est sélectionnée, bc possède une
variable spéciale supplémentaire. Cette variable spéciale, history, est
le nombre de lignes d'historique mémorisées. Pour readline, une valeur
de -1 signifie qu'un nombre illimité de lignes d'historique sont
mémorisées. Fixer la valeur de history à un nombre positif restreint le
nombre de lignes d'historique au nombre fourni. La valeur 0 désactive cette
fonctionnalité d'historique. La valeur par défaut est 100. Pour plus
d'informations, lisez les manuels d'utilisateur des bibliothèques GNU
readline et history, et BSD libedit. Il n’est pas possible
d’activer à la fois readline et libedit.
DIFFÉRENCES
Cette version de bc a été implémentée sur la base du document de travail
POSIX P1003.2/D11 et contient plusieurs différences et extensions par
rapport au document de travail et aux implémentations traditionnelles. Elle
n'a pas été implémentée de la façon traditionnelle en utilisant
dc(1). Cette version est un unique processus qui analyse et exécute une
traduction en code intermédiaire (byte code) du programme. Il y a une option
« non documentée » (-c) qui fait émettre par le programme le code
intermédiaire sur la sortie standard au lieu de l'exécuter. Elle a été
principalement utilisée pour déboguer l'analyseur syntaxique et pour
préparer la bibliothèque mathématique.
Une source majeure de différences est constituée par les extensions, où une
fonctionnalité est étendue pour offrir plus de fonctionnalités et des ajouts
pour de nouvelles fonctionnalités. Voici la liste des différences et des
extensions :
- environnement LANG
-
Cette version ne se conforme pas à la norme POSIX en ce qui concerne le
traitement de la variable d'environnement LANG et de toutes les variables
d'environnement dont le nom débute par LC_.
- noms
-
Les bc traditionnel et POSIX ont des noms composés d'une seule lettre
pour les fonctions, les variables et les tableaux. Ils ont été étendus pour
gérer les noms multicaractères débutant par une lettre et pouvant contenir
des lettres, des nombres et le caractère de soulignement (_).
- chaines
-
Les chaînes de caractères ne peuvent pas contenir d’octet NULL. POSIX dit
que tous les caractères doivent être inclus dans des chaînes.
- last
-
Le bc POSIX ne possède pas de variable last. Certaines implémentations
de bc utilisent le point (.) d'une manière similaire.
- comparaisons
-
Le bc POSIX ne permet les comparaisons que dans l'instruction if,
l'instruction while et la seconde expression de l'instruction for. De plus,
une seule opération relationnelle est permise dans chacune de ces
instructions.
- if instruction, else clause
-
Le bc POSIX ne possède pas de clause else.
- instruction for
-
Le bc POSIX requiert que toutes les expressions soient présentes dans
l'instruction for.
- &&, ||, !
-
Le bc POSIX ne dispose pas des opérateurs logiques.
- fonction read
-
Le bc POSIX ne possède pas de fonction read.
- instruction print
-
Le bc POSIX ne possède pas d'instruction print.
- instruction continue
-
Le bc POSIX ne possède pas d'instruction continue.
- instruction return
-
Le bc POSIX requiert des parenthèses autour de l'expression return.
- paramètres de tableau
-
Le bc POSIX ne gère (actuellement) pas totalement les paramètres
tableau. La grammaire POSIX autorise les tableaux dans les définitions de
fonction, mais ne fournit pas de méthode pour spécifier un tableau comme
paramètre réel. C'est plus que probablement un oubli dans la grammaire. Les
implémentations traditionnelles de bc ne gèrent que les paramètres
tableau par valeur.
- format de fonction
-
Le bc POSIX requiert que l'accolade ouvrante soit sur la même ligne que
le mot-clé define et que l'instruction auto soit sur la ligne
suivante.
- =+, =-, =*, =/, =%, =^
-
Le bc POSIX ne requiert pas la définition de ces opérateurs d'affectation
dans « l’ancien style ». Cette version peut permettre ces affectations dans
« l’ancien style ». Utilisez l'instruction limits pour voir si la version
installée les prend en charge. Si elle gère les opérateurs d'affectation
dans « l’ancien style », l'instruction « a = -1 » décrémentera a de 1 au
lieu de fixer a à la valeur -1.
- espaces dans les nombres
-
D'autres implémentations de bc permettent les espaces dans les
nombres. Par exemple, « x=1 3 » affecterait la valeur 13 à la variable x. La
même instruction causerait une erreur de syntaxe dans cette version de
bc.
- erreurs et exécution
-
Cette implémentation se différencie des autres implémentations par le code
qui est exécuté quand des erreurs de syntaxe ou d'autres erreurs sont
détectées dans le programme. Si une erreur de syntaxe est trouvée dans une
définition de fonction, la récupération des erreurs essaie de trouver le
début d'une instruction et continue à analyser la fonction. Une fois qu'une
erreur de syntaxe est trouvée dans la fonction, la fonction ne sera pas
appelable et devient non définie. Les erreurs de syntaxe dans le code
d'exécution interactive invalideront le bloc d'exécution courant. Le bloc
d'exécution est terminé par une fin de ligne qui apparaît après une séquence
complète d'instructions. Par exemple,
- a = 1
b = 2
possède deux blocs d'exécution et
- { a = 1
b = 2 }
en possède un. Toute erreur à l'exécution terminera l'exécution du bloc
d'exécution courant. Un avertissement à l'exécution ne terminera pas
l'exécution du bloc d'exécution courant.
- Interruptions
-
Durant une session interactive, le signal SIGINT (habituellement généré par
la séquence control-C sur le terminal) interrompra l'exécution du bloc
d'exécution courant. Il provoquera l'affichage d'une erreur à l'exécution
indiquant quelle fonction a été interrompue. Après que toutes les structures
à l'exécution ont été « nettoyées », un message est affiché pour notifier
l'utilisateur que bc est prêt à recevoir des entrées
supplémentaires. Toutes les fonctions précédemment définies le restent, et
la valeur de toutes les variables non automatiques est celle ayant cours au
moment de l'interruption. Toutes les variables automatiques et paramètres de
fonction sont supprimés durant le processus de nettoyage. Durant une session
non interactive, le signal SIGINT terminera l'exécution entière de bc.
LIMITES
Voici les limites actuellement en vigueur pour ce processeur
bc. Certaines d'entre elles peuvent avoir été modifiées par une
installation. Utilisez l'instruction limits pour voir les valeurs réelles.
- BC_BASE_MAX
-
La base de sortie maximale est actuellement fixée à 999. La base d'entrée
maximale est 16.
- BC_DIM_MAX
-
C'est actuellement une limite arbitraire de 65535 dans la
distribution. Votre installation peut être différente.
- BC_SCALE_MAX
-
Le nombre de chiffres après le point décimal est limité à INT_MAX
chiffres. Le nombre de chiffres avant le point décimal est également limité
à INT_MAX chiffres.
- BC_STRING_MAX
-
La limite sur le nombre de caractères dans une chaîne est de INT_MAX
caractères.
- exposant
-
La valeur de l'exposant dans l'opération d’exponentielle (^) est limitée à
LONG_MAX.
- noms de variable
-
Le nombre maximal de noms uniques est fixé à 32767 pour toutes les variables
simples, les tableaux et les fonctions.
VARIABLES D'ENVIRONNEMENT
Les variables d’environnement suivantes sont prises en compte par bc :
- POSIXLY_CORRECT
-
C’est la même chose que l’option -s.
- BC_ENV_ARGS
-
C'est un autre mécanisme pour obtenir des arguments pour bc. Le format
est le même que celui des arguments en ligne de commande. Ces arguments sont
traités en premier lieu, de sorte que les fichiers listés dans les arguments
d'environnement sont traités avant n'importe quel fichier apparaissant comme
argument sur la ligne de commande. Cela permet à l'utilisateur de définir
des options et des fichiers « standard » à traiter lors de chaque invocation
de bc. Les fichiers présents dans les variables d'environnement
contiennent typiquement des définitions de fonction pour les fonctions que
l'utilisateur veut voir définies à chaque fois que bc est exécuté.
- BC_LINE_LENGTH
-
Cela doit être un entier spécifiant le nombre de caractères dans une ligne
de sortie pour les nombres. Cela inclut les caractères de barre oblique
inversée et de saut de ligne pour les nombres longs. Comme extension, la
valeur zéro désactive la fonctionnalité multiligne. Toute autre valeur de
cette variable inférieure à trois définit la longueur de ligne à 70.
DIAGNOSTICS
Si l'un des fichiers de la ligne de commandes ne peut être ouvert, bc
indiquera que le fichier n'est pas disponible et se terminera. Il y a
également des diagnostics lors de la compilation et de l'exécution qui
devraient être suffisamment auto-explicites.
BOGUES
La récupération après erreur n'est pas encore très bonne.
Envoyez vos rapports de bogues par courriel à
bug-bc@gnu.org. Assurez-vous d'inclure le mot « bc » quelque part dans le
champ « Sujet : ».
AUTEUR
Philip A. Nelson
philnelson@acm.org
REMERCIEMENTS
L'auteur veut remercier Steve Sommars (Steve.Sommars@att.com) pour son aide
intensive lors des tests de l'implémentation. Il a fourni beaucoup de
suggestions géniales. C'est un produit bien meilleur grâce à son
implication.
TRADUCTION
La traduction française de cette page de manuel a été créée par
Frédéric Delanoy <delanoy_f@yahoo.com>
et
Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- SYNTAXE
-
- DESCRIPTION
-
- OPTIONS
-
- NOMBRES
-
- VARIABLES
-
- COMMENTAIRES
-
- EXPRESSIONS
-
- INSTRUCTIONS
-
- PSEUDO-INSTRUCTIONS
-
- FONCTIONS
-
- BIBLIOTHÈQUE MATHÉMATIQUE
-
- EXEMPLES
-
- OPTIONS READLINE ET LIBEDIT
-
- DIFFÉRENCES
-
- LIMITES
-
- VARIABLES D'ENVIRONNEMENT
-
- DIAGNOSTICS
-
- BOGUES
-
- AUTEUR
-
- REMERCIEMENTS
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:05:53 GMT, September 19, 2025