dc(1)

NOM
dc — Une calculatrice de précision arbitraire

SYNOPSIS
dc [-V] [--version] [-h] [--help]
   [-e script] [--expression=script]
   [-f fichier_script] [--file=fichier_script]
   [fichier ...]

DESCRIPTION

dc est une calculatrice de bureau en notation polonaise inverse qui prend en charge une arithmétique de précision illimitée. Elle permet aussi de définir et d’appeler des macros. Normalement, dc lit l’entrée standard ; si des arguments de commande sont fournis, ce sont des noms de fichier, et dc en lira et en exécutera le contenu avant de lire l’entrée standard. Toute sortie normale s’effectue sur la sortie standard ; tout message d’erreur est envoyé sur la sortie d’erreur.

Une calculatrice en notation polonaise inverse stocke les nombres sur une pile. Entrer un nombre le place au sommet de la pile. Les opérations arithmétiques dépilent les arguments et empilent les résultats.

Pour entrer un nombre dans dc, tapez les chiffres (en utilisant les lettres capitales A à F comme « chiffres » pour les bases d’entrée supérieures à dix), en incluant éventuellement un point décimal. La notation exponentielle n’est pas prise en charge. Pour entrer un nombre négatif, faites le précéder du caractère de soulignement « _ ». Le signe moins « - » ne peut pas être utilisé à cet effet, car il s’agit d’un opérateur binaire utilisé pour la soustraction. Pour entrer deux nombres successifs, séparez les par une espace ou un retour à la ligne. Ces derniers n’ont aucune signification en tant que commande.

OPTIONS
dc peut être invoqué avec les options de ligne de commande suivantes :

-V

--version
    Afficher la version de l’instance de dc en cours d’exécution, une mention des droits d’auteur, puis quitter.

-h

--help
    Afficher un message d’utilisation énumérant ces options de ligne de commande, l’adresse pour l’envoi des rapports de bogue, puis quitter.

-e script

--expression=script
    Ajouter les commandes contenues dans script au jeu de commandes à exécuter lors du traitement de l’entrée.

-f fichier_script

--file=fichier_script
    Ajouter les commandes contenues dans le fichier fichier_script au jeu de commandes à exécuter lors du traitement de l’entrée.

Si des arguments autres que les options décrites ci-avant apparaissent sur la ligne de commande, ils seront interprétés comme des noms de fichier d’entrée à traiter. Le nom de fichier « - » fait référence à l’entrée standard. Si aucun script ou fichier de script n’est spécifié, c’est l’entrée standard qui sera traitée.

Commandes d’affichage

p   Afficher la valeur du sommet de la pile sans modifier cette dernière. Un retour à la ligne est ajouté après la valeur.

n   Afficher la valeur du sommet de la pile tout en la dépilant et sans ajouter de retour à la ligne après la valeur.

P   Dépiler la valeur du sommet de la pile. S’il s’agit d’une chaîne, elle est simplement affichée sans retour à la ligne final. Sinon il s’agit d’un nombre, et la partie entière de sa valeur absolue est affichée comme une suite d’octets « base (UCHAR_MAX+1) ». En supposant que (UCHAR_MAX+1) est égal à 256 (comme c’est le cas sur la plupart des machines avec des multiplets de 8 bits), la séquence KSK0k1/_1Ss [ls*]Sxd0>x [256~Ssd0<x]dsxxsx[q]Sq[Lsd0>qaPlxx] dsxxsx0sqLqsxLxLK+k pourrait aussi effectuer cette opération. La complexité du code propre à dc ci-avant est en grande partie due au fait que « ~ » traite les caractères en sens inverse et au souhait de s’assurer que tous les registres finissent par retrouver leurs états initiaux.

f   Afficher la totalité du contenu de la pile sans modifier quoi que ce soit. C’est une commande utile si vous êtes perdu ou souhaitez vous faire une idée de l’effet produit par une certaine commande.

Arithmétique

+   Dépiler deux valeurs, en faire la somme et empiler le résultat. La précision ne dépend que des valeurs des arguments et est suffisamment grande pour un résultat exact.

-   Dépiler deux valeurs, soustraire la première de la seconde et empiler le résultat.

*   Dépiler deux valeurs, multiplier l’une par l’autre et empiler le résultat. Le nombre de chiffres après la virgule du résultat dépend de la valeur de la précision actuelle et du nombre de chiffres après la virgule des deux arguments.

/   Dépiler deux valeurs, diviser la seconde par la première et empiler le résultat. Le nombre de chiffres après la virgule du résultat dépend de la valeur de la précision.

%   Dépiler deux valeurs, calculer le reste de la division de la seconde par la première et empiler le résultat. La valeur est la même que celle qui serait calculée par la séquence Sd dld/ Ld*- .

~   Dépiler deux valeurs et diviser la seconde par la première. Empiler tout d’abord le quotient, puis faire de même avec le reste de la division. Le nombre de chiffres après la virgule utilisé dans la division dépend de la valeur de la précision. La séquence SdSn lnld/ LnLd% pourrait aussi effectuer cette opération avec un traitement des erreurs légèrement différent.

^   Dépiler deux valeurs et en calculer l’exponentielle en utilisant la première valeur comme exposant et la seconde comme base. La partie non entière de l’exposant est ignorée. Le nombre de chiffres après la virgule du résultat dépend de la valeur de la précision.

|   Dépiler trois valeurs et en calculer l’exponentiation modulaire. La première valeur est la réduction modulaire ; il doit s’agir d’un nombre entier différent de zéro. La seconde valeur est l’exposant ; il doit s’agir d’un nombre supérieur ou égal à zéro dont la partie non entière sera ignorée. La troisième valeur est la base, objet de l’exponentiation, qui doit être un nombre entier. Pour les petits nombres entiers, la séquence Sm^Lm% pourra effectuer la même opération, mais à la différence de ^, cette commande fonctionnera avec des exposants de grandeur quelconque.

v   Dépiler une valeur, en calculer la racine carrée et empiler le résultat. Le nombre de chiffres après la virgule du résultat dépend de la valeur maximale de la précision et de la précision de l’argument.

La plupart des opérations arithmétiques sont affectées par la « valeur de précision » qui peut être définie à l’aide de la commande k. La valeur de précision par défaut est zéro ; avec cette valeur, toutes les opérations arithmétiques, l'addition et la soustraction n’étant pas concernées, produiront des résultats entiers.

Contrôle de la pile

c   Vider la pile.

d   Dupliquer la valeur au sommet de la pile et en empiler une autre copie. Ainsi, « 4d*p » calcule 4 au carré et affiche le résultat.

r   Inverser l’ordre des deux valeurs du sommet de la pile (les échanger). La séquence SaSbLaLb permet d’effectuer la même opération.

R   Dépiler l'élément du haut de la pile sous forme d'un entier n. Effectuer une rotation cyclique des n éléments au sommet de la pile dépilée. Si n est positif, la direction de la rotation fera que l’élément au sommet de la pile deviendra le second à partir du sommet ; si n est négatif, la direction de la rotation fera que l’élément au sommet de la pile deviendra l’élément de rang n à partir du sommet. Si la hauteur de la pile est inférieure à n, la rotation s’effectuera sur l’ensemble de la pile (dans la direction appropriée), sans générer de signalement d’erreur.

Registres

dc fournit au moins 256 registres en mémoire, chacun d’entre eux étant nommé à l’aide d’un unique caractère. Il est ainsi possible de stocker un nombre ou une chaîne dans un registre et les retrouver plus tard.

sr  Dépiler une valeur et stocker cette dernière dans le registre r.

lr  Faire une copie de la valeur stockée dans le registre r et empiler le résultat. Si le registre n’a pas été initialisé, la valeur copiée sera 0. Cette opération ne modifie pas le contenu du registre r.

Chaque registre contient aussi sa propre pile. La valeur actuelle du registre correspond à la valeur du sommet de la pile du registre.

Sr  Dépiler la pile principale et placer la valeur obtenue au sommet de la pile du registre r. La valeur précédente du registre devient inaccessible.

Lr  Dépiler la pile du registre r et placer la valeur obtenue au sommet de la pile principale. La valeur précédente de la pile du registre, si elle existe, peut maintenant être lue à l’aide de la commande lr.

Paramètres

dc possède trois paramètres permettant de contrôler ses opérations : la précision, la base de l’entrée et la base de la sortie. La précision indique le nombre de chiffres après la virgule à conserver dans le résultat de la plupart des opérations. La base de l’entrée contrôle l’interprétation des nombres entrés ; tous les nombres entrés seront dans cette base. La base de la sortie contrôle l’affichage des nombres.

Les bases de l’entrée et de la sortie sont des paramètres distincts ; elles peuvent être différentes, ce qui peut s’avérer utile ou source de confusion. La base de l’entrée doit être comprise entre 2 et 16 inclus. La valeur minimale de la base de la sortie est 2. La valeur minimale de la précision est 0. Cette dernière est toujours mesurée en chiffres décimaux, quelles que soient les bases de l’entrée et de la sortie actuelles.

i   Dépiler une valeur et l’utiliser pour définir la base de l’entrée.

o   Dépiler une valeur et l’utiliser pour définir la base de la sortie.

k   Dépiler une valeur et l’utiliser pour définir la précision.

I   Empiler la base de l’entrée actuelle.

O   Empiler la base de la sortie actuelle.

K   Empiler la précision actuelle.

Chaînes

Comme il peut opérer sur des nombres, dc peut aussi opérer sur des chaînes, mais de manière limitée. Les seules opérations possibles sur les chaînes sont l’affichage et l’exécution en tant que macro (ce qui signifie que le contenu de la chaîne sera traité comme une commande de dc). Tous les registres et la pile peuvent contenir des chaînes, et dc saura toujours si un objet donné est un nombre ou une chaîne. Certaines commandes comme les opérations arithmétiques attendent des nombres comme arguments et afficheront une erreur si ces derniers sont des chaînes. D’autres commandes acceptent un nombre ou une chaîne ; par exemple, la commande p accepte l’un ou l’autre et affichera l’objet en fonction de son type.

[caractères]
    Construire une chaîne contenant les caractères spécifiés (entourés de crochets ouvrant [ et fermant ]) et empiler le résultat. Par exemple, [toto]P affichera la chaîne toto (sans retour à la ligne).

a   Dépiler une valeur. S’il s’agit d’un nombre, son octet de poids faible est converti en chaîne et le résultat est empilé. Sinon il s’agit d’une chaîne, et le premier caractère de cette dernière est empilé.

x   Dépiler une valeur et l’exécuter en tant que macro. Normalement, il doit s’agir d’une chaîne ; s’il s’agit d’un nombre, il sera simplement empilé à nouveau. Par exemple, [1p]x exécutera la macro 1p qui empile la valeur 1 et affiche 1 sur une ligne séparée.

Les macros sont le plus souvent stockées dans des registres ; [1p]sa stocke la macro qui affiche 1 dans le registre a et lax invoque cette macro.

>r  Dépiler deux valeurs et les comparer en supposant qu’il s’agit de nombres et en exécutant le contenu du registre r en tant que macro si la première valeur au sommet de la pile est supérieure à la seconde. Par exemple, 1 2>a invoquera le contenu du registre a, alors que 2 1>a ne l’invoquera pas.

!>r Similaire à la commande précédente, à la différence que la macro du registre r sera invoquée si la première valeur au sommet de la pile n’est pas supérieure (est inférieure ou égale) à la seconde.

<r  Similaire à la commande précédente, à la différence que la macro du registre r sera invoquée si la première valeur au sommet de la pile est inférieure à la seconde.

!<r Similaire à la commande précédente, à la différence que la macro du registre r sera invoquée si la première valeur au sommet de la pile n’est pas inférieure (est supérieure ou égale) à la seconde.

=r  Similaire à la commande précédente, à la différence que la macro du registre r sera invoquée si les deux nombres dépilés sont égaux.

!=r Similaire à la commande précédente, à la différence que la macro du registre r sera invoquée si les deux nombres dépilés ne sont pas égaux.

?   Lire une ligne depuis le terminal et l'exécuter. Cette commande permet à une macro de demander une entrée à l’utilisateur.

q   Sortir d’une macro et aussi de celle qui l’a invoquée. Si elle est exécutée au plus haut niveau, ou depuis une macro directement invoquée depuis le plus haut niveau, la commande q provoquera la terminaison de dc.

Q   Dépiler une valeur et l’utiliser comme compteur de niveaux d’exécution de macro desquels la sortie s’effectuera. Par exemple, 3Q sortira de trois niveaux. La commande Q ne provoquera jamais la terminaison de dc.

Demande d’état

Z   Dépiler une valeur, calculer le nombre de chiffres décimaux qu’elle comporte (ou le nombre de caractères s’il s’agit d’une chaîne) et empiler le résultat. Le nombre de chiffres que comporte un nombre n’inclut pas les zéros de début, même s’ils apparaissent à la droite du séparateur entre les parties entière et non entière.

X   Dépiler une valeur, calculer le nombre de chiffres que comporte sa partie non entière et empiler le résultat. Dans le cas d’une chaîne, la valeur empilée sera 0.

z   Empiler la hauteur actuelle de la pile : le nombre d’objets que contenait la pile avant l’exécution de la commande z.

Divers

!   Exécuter le reste de la ligne en tant que commande système. Notez que le traitement des commandes !<, != et !> est prioritaire, et que si vous souhaitez exécuter une commande commençant par <, = ou >, vous devrez ajouter une espace après le « ! ».

#   Le reste de la ligne sera considéré comme un commentaire.

:r  Dépiler deux valeurs, puis stocker la seconde dans le tableau r avec un indice égal à la première valeur.

;r  Dépiler une valeur et l’utiliser comme indice pour extraire la valeur correspondante dans le tableau r et empiler le résultat.

Notez que chaque instance d’un registre dans la pile possède son propre tableau. Ainsi, la séquence 1 0:x 0Sx 2 0:x Lx 0;xp affichera 1, car le 2 a été stocké dans une instance de 0:a qui a été dépilée par la suite.

FICHIERS

~/.dcrc
    Les commandes que contient ce fichier sont exécutées lors de la première exécution de dc.

BOGUES

Envoyez vos rapports de bogue à bug-dc@gnu.org.

TRADUCTION
La traduction française de cette page de manuel a été créée par Lucien Gentis <lucien.gentis@univ-lorraine.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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 à debian-l10n-french@lists.debian.org.