bc , para calculadora básica (a menudo referida como la calculadora de banco ), es " una precisión arbitraria lenguaje calculadora " con una sintaxis similar al lenguaje de programación C . bc se utiliza normalmente como un lenguaje de programación matemática o como un shell matemático interactivo.
Desarrollador (es) | Robert Morris y Lorinda Cherry de Bell Labs , Philip A. Nelson |
---|---|
Versión inicial | 1975, hace 45–46 años |
Sistema operativo | Unix , similar a Unix , Plan 9 , FreeDOS |
Plataforma | Multiplataforma |
Tipo | Mando |
Descripción general
Un uso interactivo típico es escribir el comando bc
en un símbolo del sistema de Unix e ingresar una expresión matemática, como , con lo cual(1 + 3) * 2
8será la salida. Si bien bc puede funcionar con precisión arbitraria, en realidad tiene un valor predeterminado de cero dígitos después del punto decimal, por lo que la expresión 2/3
produce0. Esto puede sorprender a los nuevos usuarios de bc que no se dan cuenta de este hecho. La -l
opción bc establece la escala predeterminada (dígitos después del punto decimal) en 20 y agrega varias funciones matemáticas adicionales al idioma.
Historia
bc apareció por primera vez en la versión 6 de Unix en 1975 y fue escrito por Robert Morris y Lorinda Cherry de Bell Labs . bc fue precedido por dc , una calculadora de precisión arbitraria anterior escrita por los mismos autores. dc podía hacer cálculos de precisión arbitraria, pero su sintaxis de notación polaca inversa (RPN), muy apreciada por muchos para evaluar fórmulas algebraicas, resultó inconveniente para sus usuarios al expresar el control de flujo y, por lo tanto, bc se escribió como una interfaz para dc. bc era un compilador muy simple (un solo archivo fuente yacc con unos pocos cientos de líneas), que convertía la nueva sintaxis bc, similar a C, en la notación postfija de dc y canalizaba los resultados a través de dc.
En 1991, POSIX definió y estandarizó rigurosamente bc. Tres implementaciones de este estándar sobreviven hoy: la primera es la implementación tradicional de Unix, un front-end para dc, que sobrevive en los sistemas Unix y Plan 9 . El segundo es el software libre GNU bc, lanzado por primera vez en 1991 por Philip A. Nelson. La implementación de GNU tiene numerosas extensiones más allá del estándar POSIX y ya no es un front-end para dc (es un intérprete de código de bytes ). El tercero es una reimplementación de OpenBSD en 2003.
Implementaciones
POSIX bc
El lenguaje bc estandarizado POSIX se escribe tradicionalmente como un programa en el lenguaje de programación dc para proporcionar un mayor nivel de acceso a las características del lenguaje dc sin las complejidades de la sintaxis concisa de dc.
En esta forma, el lenguaje bc contiene variables de una sola letra , matrices y nombres de funciones y la mayoría de los operadores aritméticos estándar, así como las conocidas construcciones de flujo de control ( , y ) de C.A diferencia de C, una cláusula no puede ir seguida de una .if(cond)...
while(cond)...
for(init;cond;inc)...
if
else
Las funciones se definen mediante una define
palabra clave y los valores se devuelven de ellas mediante un return
seguido del valor de retorno entre paréntesis. La auto
palabra clave (opcional en C) se usa para declarar una variable como local a una función.
Todos los números y el contenido de las variables son números de precisión arbitraria cuya precisión (en lugares decimales) está determinada por la scale
variable global .
La base numérica de las constantes de entrada (en modo interactivo), salida y programa se puede especificar configurando las variables reservadas ibase
(base de entrada) y obase
(base de salida).
La salida se genera al no asignar deliberadamente el resultado de un cálculo a una variable.
Se pueden agregar comentarios al código bc mediante el uso de los símbolos C /*
y */
(comentario inicial y final).
Operadores matemáticos
Exactamente como C
Los siguientes operadores POSIX bc se comportan exactamente como sus contrapartes C:
+ - * /+ = - = * = / =++ - <>==! = <=> =() [] {}
Similar a C
Los operadores de módulo%
y se %=
comportan exactamente como sus contrapartes de C solo cuando la scale
variable global se establece en 0, es decir, todos los cálculos son solo enteros. De lo contrario, el cálculo se realiza con la escala adecuada. a%b
se define como a-(a/b)*b
. Ejemplos:
$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. Este es un software gratuito SIN NINGUNA GARANTÍA. Para obtener detalles, escriba "garantía".escala = 0; 5% 32escala = 1; 5% 3.2escala = 20; 5% 3.00000000000000000002
Conflicto con C
Los operadores
^ ^ =
se parecen superficialmente a los operadores or exclusivos bit a bit de C , pero de hecho son los operadores de exponenciación de enteros bc.
Cabe destacar que el uso del ^
operador con números negativos no sigue la precedencia del operador C. -2^2
da la respuesta de 4 bajo bc en lugar de -4.
Operadores "faltantes" relativos a C
Los operadores bit a bit , booleanos y condicionales :
& | ^ && ||& = | = ^ = && = || =<< >><< = >> =?:
no están disponibles en POSIX bc.
Funciones integradas
La sqrt()
función para calcular raíces cuadradas es la única función matemática incorporada de POSIX bc. Otras funciones están disponibles en una biblioteca estándar externa.
La scale()
función para determinar la precisión (como con la scale
variable) de su argumento y la length()
función para determinar el número de dígitos decimales significativos en su argumento también están incorporadas.
Funciones de biblioteca estándar
biblioteca matemática estándar de BC (definido con el -l opción) contiene funciones para el cálculo de seno , coseno , arco tangente , logaritmo natural , la función exponencial y los dos parámetro función de Bessel J . La mayoría de las funciones matemáticas estándar (incluidas las otras funciones trigonométricas inversas) se pueden construir utilizando estas. Consulte los enlaces externos para ver implementaciones de muchas otras funciones.
comando bc | Función | Descripción |
---|---|---|
s(x) | Seno | Toma x , un ángulo en radianes |
c(x) | Coseno | Toma x , un ángulo en radianes |
a(x) | Arctangent | Devuelve radianes |
l(x) | Logaritmo natural | |
e(x) | Funcion exponencial | |
j(n,x) | Función de Bessel | Devuelve la función de Bessel order- n de x . |
La opción -l cambia la escala a 20, [1] por lo que cosas como módulo pueden funcionar inesperadamente. Por ejemplo, escribiendo bc -l
y luego el comando da como print 3%2
resultado 0. Pero escribiendo scale=0
después bc -l
y luego el comando print 3%2
dará como resultado 1.
Plan 9 a. C.
El plan 9 bc es idéntico al POSIX bc pero para una print
declaración adicional .
GNU bc
GNU bc se deriva del estándar POSIX e incluye muchas mejoras. Es completamente independiente de las implementaciones basadas en cd del estándar POSIX y, en cambio, está escrito en C. Sin embargo, es totalmente compatible con versiones anteriores ya que todos los programas POSIX bc se ejecutarán sin modificaciones como programas GNU bc.
Las variables, matrices y nombres de funciones de GNU bc pueden contener más de un carácter, se han incluido algunos operadores más de C y, en particular, una if
cláusula puede ir seguida de un else
.
La salida se logra al no asignar deliberadamente un resultado de un cálculo a una variable (al modo POSIX) o al usar la print
declaración agregada .
Además, una read
declaración permite la entrada interactiva de un número en un cálculo en ejecución.
Además de los comentarios de estilo C, un #
carácter hará que se ignore todo lo que le sigue hasta la siguiente nueva línea.
El valor del último cálculo siempre se almacena dentro de la last
variable incorporada adicional .
Operadores adicionales
Los siguientes operadores lógicos son adicionales a los de POSIX bc:
&& || !
Están disponibles para su uso en declaraciones condicionales (como dentro de una if
declaración). Sin embargo, tenga en cuenta que todavía no existen operaciones de asignación o bit a bit equivalentes.
Funciones
Todas las funciones disponibles en GNU bc se heredan de POSIX. No se proporcionan más funciones de serie con la distribución GNU.
Código de ejemplo
Dado que el ^
operador bc solo permite una potencia entera a su derecha, una de las primeras funciones que un usuario de bc podría escribir es una función de potencia con un exponente de coma flotante. Ambos de los siguientes asumen que se ha incluido la biblioteca estándar:
Una función de "potencia" en POSIX bc
/ * Una función para devolver la parte entera de x * / definir i ( x ) { auto s s = escala escala = 0 x / = 1 / * redondear x hacia abajo * / escala = s retorno ( x ) } / * Usa el hecho de que x ^ y == e ^ (y * log (x)) * / define p ( x , y ) { if ( y == i ( y )) { return ( x ^ y ) } return ( e ( y * l ( x ) ) ) }
Calcular π a 10000 dígitos
Calcule pi usando la función arcangente incorporada , a () :
$ bc -lq escala = 100004 * a (1) # El atan de 1 es 45 grados, que es pi / 4 en radianes. # Esto puede tardar varios minutos en calcularse.
Una función C traducida
Debido a que la sintaxis de bc es similar a la de C , las funciones numéricas publicadas escritas en C a menudo se pueden traducir a bc con bastante facilidad, lo que proporciona inmediatamente la precisión arbitraria de bc. Por ejemplo, en el Journal of Statistical Software (julio de 2004, volumen 11, número 5), George Marsaglia publicó el siguiente código C para la distribución normal acumulativa :
doble Phi ( doble x ) { doble largo s = x , t = 0 , b = x , q = x * x , i = 1 ; mientras ( s ! = t ) s = ( t = s ) + ( b * = q / ( i + = 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }
Con algunos cambios necesarios para adaptarse a la sintaxis diferente de bc, y al darse cuenta de que la constante "0.9189 ..." es en realidad log (2 * PI) / 2, esto se puede traducir al siguiente código GNU bc:
definir phi ( x ) { auto s , t , b , q , i , const s = x ; t = 0 ; b = x ; q = x * x ; i = 1 while ( s ! = t ) s = ( t = s ) + ( b * = q / ( i + = 2 )) const = 0.5 * l ( 8 * a ( 1 )) # 0.91893 ... return .5 + s * e ( - .5 * q - constante ) }
Usando bc en scripts de shell
bc se puede utilizar de forma no interactiva, con entrada a través de una tubería . Esto es útil dentro de los scripts de shell . Por ejemplo:
$ resultado = $ ( echo "escala = 2; 5 * 7/3;" | bc ) $ echo $ resultado 11.66
Por el contrario, tenga en cuenta que el shell bash solo realiza aritmética de números enteros, por ejemplo:
$ Resultado = $ (( 5 * 7 / 3 )) $ echo $ result 11
También se puede usar el modismo here-string (en bash, ksh, csh):
$ bc -l <<< "5 * 7/3 " 11.66666666666666666666
Ver también
- lenguaje de programación dc
- Lenguaje de programación C
- lenguaje de programación hoc
Referencias
- ↑ a b Nelson, Philip A. (20 de marzo de 2001). "bc Command Manual" . Fundación de Software Libre . Consultado el 20 de abril de 2017 .
- : lenguaje aritmético de precisión arbitraria: referencia de comandos y utilidades, la especificación única de UNIX , número 7 de The Open Group
- Página de manual de GNU bc
- POSIX bc página de manual
- - Manual del programador de Plan 9 , Volumen 1
- Página del manual de Unix bc de la 7a edición
- Un artículo de comp.compilers sobre el diseño y la implementación de C-bc
- 6.a edición de código fuente Unix bc , la primera versión de bc, de mayo de 1975, compilando la sintaxis bc en la sintaxis dc
- bc código fuente
enlaces externos
- Dittmer, I. 1993. Error en los comandos de Unix dc y bc para aritmética de precisión múltiple. SIGNUM Newsl. 28, 2 (abril de 1993), 8-11.
- Colección de funciones útiles de GNU bc
- GNU bc (y una versión alfa ) de la Free Software Foundation
- bc para Windows desde GnuWin32
- Gavin Howard bc - otra implementación de código abierto de bc por Gavin Howard con extensiones GNU y BSD
- X-bc : una interfaz gráfica de usuario para bc
- extensions.bc : contiene funciones de trigonometría, funciones exponenciales, funciones de teoría de números y algunas constantes matemáticas
- Scientific_constants.bc : contiene masas de partículas, constantes básicas, como la velocidad de la luz en el vacío y la constante gravitacional.