Herramientas de usuario

¡Esta es una revisión vieja del documento!


bc

bc es un comando que ofrece un lenguaje de cálculo de precisión arbitraria, que permite la ejecución interactiva de instrucciones para cálculo algebraico. Es capaz de leer expresiones que se interpretarán desde la entrada estándar, por lo que puede usarse en guiones de shell y - con el operador '(acento grave) - en asignaciones a variables de shell.

Ver también: Calculadora de escritorio dc

El comando bc

Aunque bc consiste únicamente en un preprocesador para dc, ofrece muchas más funciones, como funciones, operaciones lógicas y funciones matemáticas como sqrt (extracción de raíz cuadrada). El lenguaje de comandos en su conjunto se asemeja al lenguaje C, pero se encuentra sumamente simplificado debido a su naturaleza de intérprete. El comando be es muy fácil de usar y sus interacciones con dc son invisibles para el usuario; se invoca con:

$bc

La calculadora bc espera silenciosamente los datos de entrada; finaliza con la palabra clave quit o la secuencia de teclas Ctrl+D, que indica el final del archivo de entrada. Bc lee el contenido de la entrada estándar y escribe los resultados en la salida estándar, por lo que es posible redirigirle archivos. Al finalizar el archivo, bc sale, como en el siguiente ejemplo:

$ cat cmd.file
/*los comentarios empiezan con barra diagonal y asterisco, terminan con asterisco y barra diagonal*/
6+5
$bc < cmd.file
11
$

Además, bc puede tomar el nombre de un archivo como argumento.

$ be cmd.file

Esto difiere de la redirección de la entrada estándar desde un archivo que realiza bc. Al especificar el nombre de un archivo como argumento, bc lee el archivo, interpreta los comandos y solicita la entrada de terminal. Esto permite almacenar comandos y funciones complejas en un archivo y usarlos directamente desde el teclado.

Notación de bc

La calculadora bc utiliza notación infija y el final de la línea de entrada indica que el comando debe evaluarse.

En la notación bc, los números pueden tener cualquier longitud, contener un decimal en forma de punto “.” (en lugar de una coma “,”) y, si son negativos, un signo “-” (menos), por ejemplo:

-3.45667

Puede usar los operadores aritméticos habituales, por ejemplo:

$bc
3.45 + 2
5.45

Puede usar variables asignándoles nombres de una sola letra minúscula; el valor se asigna con el operador “=” (igual), como se muestra a continuación:

w = valor

El carácter w se utilizó aquí para indicar cualquier letra minúscula. Las variables permiten almacenar números temporalmente para su uso posterior y se puede hacer referencia a ellas directamente en operaciones numéricas:

$bc
y=4
3+y
7

Las variables conservan su valor hasta que se vuelven a utilizar en otras operaciones de asignación que las sobreescriba. Por demás, el comando bc trabaja con matrices de números; Los delimitadores de índice de matriz son los operadores “[” e “]”:

s[2]=3.3

Los índices de matriz empiezan en 0, por lo que en este ejemplo inicializamos el tercer elemento de la matriz “s” otorgándole el valor 3.3. El índice de matriz puede ser cualquier expresión que be interprete como un número.

La calculadora bc realiza muchos cálculos por defecto como si los números fueran enteros, pero sresulta posible cambiar el factor de escala asignando a la variable de escala un valor que especifique la cantidad de dígitos decimales que bc debe evaluar en sus operaciones. Por ejemplo:

$bc
6.456/5.678
1
scale = 3
6.456/5.678
1.137
<code>

Puede usar las variables ''ibase'' y ''obase'' - de la misma manera que se describió para el comando dc - para inicializar la base numérica de los valores de entrada y salida, respectivamente.

<code>
$bc
ibase=2
1001
9
obase=8
1001
11

De esta forma, puede realizar conversiones entre bases o cálculos numéricos en sistemas de numeración distintos del decimal.

La calculadora bc le permite usar muchos otros operadores, además de los operadores aritméticos normales reconocidos por dc, como ++ (más +) y (menos -), los que se encargan de incrementar y decrementar el valor de una variable en uno, respectivamente.

S=4
s
4
--s
3
s
3

Estos operadores cambian el valor de la variable y devuelven el nuevo valor. Por ejemplo:

S=4
t[--s] = 3.3
t[3]
3.3

t[4] no se ha definido y s es igual a 3 después de la operación. Los operadores ++ y pueden preceder o seguir al nombre de la variable; en el primer caso, actualizan la variable y devuelven el nuevo valor, mientras que en el segundo, devuelven el valor anterior de la variable y luego lo actualizan. Por ejemplo:

S=4
t[s--]=3.3
t[4]
3.3

En los dos ejemplos anteriores, el valor final de s es 3, pero el array t es diferente.

Instrucciones y operadores de bc

El comando bc ofrece operadores de asignación adicionales que modifican directamente una variable específica según el significado del operador:

=+
=-
=*
=/
=%
=^

Por ejemplo, la siguiente instrucción de asignación:

s =- 3

es equivalente a:

s = s - 3

Las secuencias de operaciones agrupadas entre los delimitadores { y } (llaves) son interpretadas por be como un solo objeto y pueden usarse como una sola instrucción. Por ejemplo:

{s=3;y=4}

La instrucción, en su conjunto, devuelve el valor devuelto por su último componente. Por ejemplo:

{s=3+2;s}
5

Las operaciones de agrupación son particularmente útiles al usar operadores lógicos, que evalúan el contenido de los paréntesis según el resultado de pruebas condicionales previas.

El comando bc admite los operadores lógicos if, for y while, que tienen el mismo significado que los operadores análogos utilizados en el lenguaje de programación de shell, pero difieren en la sintaxis. Por ejemplo, la sección condicional de una sentencia if se encierra entre paréntesis ( y ), y si la condición es verdadera, se evalúan las sentencias contenidas entre las llaves, por ejemplo:

S=3
if(S==3){
   S=+2
}
s
5

Este ejemplo nos permite realizar algunas observaciones interesantes. En primer lugar, si se abre un operador de agrupación como ( o {, las instruccioenes del comando bc pueden abarcar varias líneas, hasta que el operador de agrupación se cierre con ) o }. El comando bc no solicita que se complete la instrucción, como lo hace el shell mostrando el prompt PS2, pero si la instruccón no se completa correctamente, bc resalta el error con un breve mensaje.

  "Error de sintaxis en la línea 4, teletipo"

El mensaje indica el número de línea que contiene el error y la terminal desde la que se ingresó la entrada, que be identifica, en este caso, como “teletipo”. En segundo lugar, los operadores lógicos == (igual), (menor o igual que), >= (mayor o igual que), != (distinto), > (mayor que) y < (menor que) pueden usarse dentro de la sección condicional de la estructura if para especificar la condición que se va a probar. Si la condición probada es verdadera, el comando ejecuta las sentencias entre llaves; por el contrario (si la condición examinada es falsa), el comando no ejecuta las instrucciones entre llaves. Tenga en cuenta que, si la estructura if no incluye la sección else y desea realizar otra acción en caso de un resultado negativo, debe reescribir la sección condicional invertida (es decir, con un signo negativo). La condición se examina solo una vez, al igual que las instrucciones contenidas entre llaves se ejecutan solo una vez, si la condición es verdadera. Al utilizar una estructura de este tipo, recomendamos sangrar las líneas dentro de las secciones individuales para mejorar la legibilidad de las instrucciones, como hemos hecho en estos ejemplos.

La estructura while tiene un formato similar a la estructura if, con la diferencia de que inicia un ciclo que ejecuta repetidamente las instrucciones contenidas entre llaves hasta que la condición sea falsa (es decir, el resultado de la prueba sea negativo). Dentro del ciclo debe haber instrucciones que modifiquen la variable examinada en la sección condicional; de lo contrario, el ciclo continúa indefinidamente.

S=4
while ( s > O) {
       s
       S=-1
}
4
3
2
1

La estructura for es una versión más completa de la estructura while; Dentro de los corchetes, se incluyen tres partes distintas, separadas por el carácter ; (punto y coma). La primera parte inicializa la variable condicional, la parte central representa la sección condicional (idéntica a la utilizada en el comando while), y la tercera parte modifica la variable condicional. Podemos escribir el comando anterior como:

for (s=4 ; s>O ; --s) {
      s
}

El resultado es el mismo, pero la agrupación lógica de las operaciones de índice dentro de la sentencia for hace que este comando sea más comprensible.

El operador while se usa generalmente cuando la variable de índice solo participa en el bucle, mientras que la estructura while se prefiere cuando la variable condicional se modifica como resultado de causas complejas o depende de factores externos al bucle. No hay límite en el número de sentencias contenidas entre los corchetes [ y ], ni en la anidación de las estructuras while y for.

Puede detener la ejecución antes de la condición de salida del bucle usando la declaración break. Por ejemplo:

for ( s=4 ; s>O ; --s){
       if ( s<=2 ) break
        s
}
4
3

En este caso, break simplemente determina el final del bucle y la ejecución de la instrucción siguiente al final del for. Si hay varios bucles anidados, break detiene la ejecución del más interno; ningún operador puede detener la ejecución de todos los bucles anidados. Dentro de los programas bc no se puede usar el comando quit, puesto que el sistema lo ejecuta inmediatamente al leerlo como entrada.

Funciones en el entorno bc

El comando bc permite definir funciones. Una función es un procedimiento que tiene un nombre, acepta argumentos y devuelve un valor al ser invocado. Se puede definir una función con el comando define, seguido del nombre, los argumentos entre paréntesis y el cuerpo de la función entre llaves.

define x ( a,b ) {
       for ( s=a ; s<b ; ++s) {
             s
       }
       return (22)
}

Las funciones se identifican con nombres de un solo carácter, al igual que las variables. Los argumentos que aparecen en la línea de definición de la función representan los parámetros formales que se pueden usar como variables dentro de la función; su número no está sujeto a limitaciones, aunque es mejor no excederlo. Dentro de la función también se pueden usar variables declaradas externamente. En el ejemplo anterior, s representa una variable externa que cambia su valor después de ejecutar la función. Las variables locales, visibles solo dentro del ámbito de la función, deben declararse dentro de la función mediante la sentencia auto. El siguiente ejemplo utiliza una variable local s:

    define x ( a,b ) {
        auto s
        for ( s=a ; s<b ; ++s){
            s
    }
    return (22)
}

La variable s definida externamente no cambia su valor original al salir de la función.

Para ejecutar una función, invóquela especificando el nombre de la función y el número correcto de variables entre paréntesis y separadas por una coma. Los parámetros reales (es decir, los valores que tienen los argumentos al momento de la llamada) reemplazan los parámetros formales correspondientes especificados al definir la función. Por ejemplo, la función del ejemplo anterior debe invocarse con:

x( 3,6 )

y el resultado es:

x( 3,6)
3
4
5
22

Los números 3, 4 y 5 se obtienen evaluando repetidamente la expresión s en cada iteración del bucle for, mientras que el número 22 representa el valor devuelto por la función.

Puede almacenar el valor de retorno de la función en una variable si desea utilizarla posteriormente:

w = x( 3,6 )
3
4
5

Ahora la variable w contiene el valor 22. De estos ejemplos, puede deducir que una sola llamada a una función reemplaza una parte de un programa que puede ser compleja o que se utiliza repetidamente. Las funciones suelen ser grandes partes de los programas almacenadas en archivos, que se leen en el entorno be cuando se necesitan.

Existen algunas funciones matemáticas predefinidas que pueden incluirse al ejecutar el comando bc; si especifica, por ejemplo, la opción -l (biblioteca), cargue la biblioteca matemática:

$bc -l
Funciones incluidas en la biblioteca matemática
Función incorporada en bc Resultado
s(x) calcula el seno de x
c(x) calcula el coseno de x
e(x) devuelve el exponente de x
l(x) devuelve el logaritmo de x
a(x) calcula la arcotangente de x
j(n,x) devuelve la función de Bessel de x.
Al cargar la biblioteca matemática, tenga cuidado de no usar sus nombres de función para definir nuevas funciones.

Ver también: Tutorial de cálculo numérico en la terminal

Este sitio web utiliza cookies para guardar datos esenciales de su actividad, como su autenticación. Al entrar acepta el uso de cookies.

Más información