Articulo de referencia

bc (lenguaje de programación)

bc es un programa de calculadora matemática de precisión arbitraria con un lenguaje de entrada similar a C. Admite tanto una interfaz de usuario interactiva por línea de comando...

bc es un programa de calculadora matemática de precisión arbitraria con un lenguaje de entrada similar a C. Admite tanto una interfaz de usuario interactiva por línea de comandos como el procesamiento mediante scripts.

Descripción general

Un uso interactivo típico consiste en escribir el comando bcen un símbolo del sistema de Unix e introducir una expresión matemática, como por ejemplo , donde(1 + 3) * 28será la salida.

Aunque bc puede trabajar con precisión arbitraria, por defecto utiliza cero dígitos después del punto decimal, por lo que la expresión 2/3produce0(Los resultados se truncan, no se redondean). Esto puede sorprender a los nuevos usuarios de bc. La -lopción bc establece la escala predeterminada (dígitos después del punto decimal) en 20 y agrega varias funciones matemáticas adicionales al lenguaje.

Historia

bc apareció por primera vez en la versión 6 de Unix en 1975. Fue escrito por Lorinda Cherry de Bell Labs como una interfaz para dc , una calculadora de precisión arbitraria escrita por Robert Morris y Cherry. dc realizaba cálculos de precisión arbitraria especificados en notación polaca inversa . bc proporcionaba una interfaz de lenguaje de programación convencional para la misma funcionalidad a través de un compilador simple (un único archivo fuente yacc que consta de unos pocos cientos de líneas de código), que convertía una sintaxis similar a C en notación dc y enviaba los resultados a través de dc.

En 1991, POSIX definió y estandarizó rigurosamente bc. Cuatro implementaciones de este estándar sobreviven hoy: La primera es la implementación tradicional de Unix, una interfaz para dc, que sobrevive en sistemas Unix y Plan 9. La segunda 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 una interfaz para dc (es un intérprete de bytecode ). La tercera es una reimplementación de OpenBSD en 2003. La cuarta es una implementación independiente de Gavin Howard [ 1 ] que está incluida en Android (sistema operativo) , [ 2 ] [ 3 ] FreeBSD a partir de la versión 13.3-RELEASE, [ 4 ] [ 5 ] [ 6 ] y macOS a partir de la versión 13.0. [ 7 ] [ 8 ] [ 9 ]

Etimología

El manual original de UNIX versión 6 [ 10 ] no explica qué significan las siglas “bc”. A lo largo de los años, diversas fuentes se han referido a él como “calculadora básica” [ 11 ] , “calculadora de banco” [ 12 ] y “calculadora binaria” [ 13 ] .

Implementaciones

POSIX bc

El lenguaje bc, estandarizado por 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 su concisa sintaxis.

En esta forma, el lenguaje bc contiene nombres de variables , matrices y funciones de una sola letra y la mayoría de los operadores aritméticos estándar, así como las construcciones de flujo de control familiares ( , y ) de C. A diferencia de C, una cláusula no puede ir seguida de un .if(cond)...while(cond)...for(init;cond;inc)...ifelse

Las funciones se definen mediante una definepalabra clave, y los valores se devuelven mediante una returncoma seguida del valor de retorno entre paréntesis. La autopalabra clave (opcional en C) se utiliza 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 decimales) está determinada por la scalevariable 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 (base de salida).obase

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 de inicio y fin).

Operadores matemáticos

Exactamente como C

Los siguientes operadores bc de POSIX se comportan exactamente igual que sus equivalentes en C:

+ - * / += -= *= /= ++ -- < > == != <= >= ( ) [ ] { }
Similar a C

Los operadores de módulo% se %=comportan exactamente igual que sus contrapartes en C solo cuando la scalevariable 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 apropiada. a%bse define como a-(a/b)*b. Ejemplos:

$ bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. Este es software libre SIN ABSOLUTAMENTE NINGUNA GARANTÍA. Para obtener más detalles, escriba `warranty`. scale=0; 5%3 2 scale=1; 5%3 .2 scale=20; 5%3 .00000000000000000002
En conflicto con C

Los operadores

^ ^=

Aunque superficialmente se parecen a los operadores OR exclusivos bit a bit de C , en realidad son los operadores de exponenciación de enteros de bc.

Es particularmente notable que el uso del ^operador con números negativos no sigue la precedencia de operadores de C. -2^2Da la respuesta de 4 bajo bc en lugar de −4.

Operadores "faltantes" en relación con 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 integrada de POSIX bc. Hay otras funciones disponibles en una biblioteca estándar externa.

También están integradas la scale()función para determinar la precisión (al igual que con la scalevariable) de su argumento y la función para determinar el número de dígitos decimales significativos en su argumento.length()

Funciones de la biblioteca estándar

La biblioteca matemática estándar de bc (definida con la opción -l ) contiene funciones para calcular el seno , el coseno , la arcotangente , el logaritmo natural , la función exponencial y la función de Bessel de dos parámetros J. La mayoría de las funciones matemáticas estándar (incluidas las demás funciones trigonométricas inversas) se pueden construir utilizando estas funciones. Consulte los enlaces externos para ver implementaciones de muchas otras funciones.

La opción -l cambia la escala a 20, [ 14 ] por lo que cosas como el módulo pueden funcionar inesperadamente. Por ejemplo, escribir bc -ly luego el comando print 3%2devuelve 0. Pero escribir scale=0después bc -ly luego el comando print 3%2devuelve 1.

Plan 9 a. C.

El Plan 9 bc es idéntico al POSIX bc, excepto por una printinstrucción adicional.

GNU bc

GNU bc deriva del estándar POSIX e incluye numerosas extensiones. Es completamente independiente de las implementaciones del estándar POSIX basadas en dc y, en cambio, está escrito en C. No obstante, es totalmente compatible con versiones anteriores, ya que todos los programas BP de POSIX 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 ifcláusula puede ir seguida de un else.

El resultado se obtiene bien no asignando deliberadamente el resultado de un cálculo a una variable (el método POSIX) o bien utilizando la printinstrucción añadida.

Además, una readinstrucción permite la introducción interactiva de un número en un cálculo en curso.

Además de los comentarios al estilo C, un #carácter hará que todo lo que le siga hasta el siguiente salto de línea sea ignorado.

El valor del último cálculo siempre se almacena en la variable integrada adicional last.

Operadores adicionales

Los siguientes operadores lógicos son adicionales a los que se encuentran en POSIX bc:

&& || !

Se pueden usar en sentencias condicionales (como dentro de una ifsentencia). Sin embargo, tenga en cuenta que aún no existen operaciones equivalentes a nivel de bits o de asignación.

Funciones

Todas las funciones disponibles en GNU bc se heredan de POSIX. No se proporcionan funciones adicionales de forma estándar 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 punto flotante. Ambas funciones 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 */ define i ( x ) { auto s s = escala escala = 0 x /= 1 /* redondear x hacia abajo */ escala = s return ( x ) }/* Usamos 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 ) ) ) }

Cálculo de π con 10000 dígitos

Calcula pi usando la función arcotangente integrada , a() :

$ bc -lq scale=10000 4*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 :

double Phi ( double x ) { long double s = x , t = 0 , b = x , q = x * x , i = 1 ; while ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )); return .5 + s * exp ( -.5 * q -.91893853320467274178L ); }

Con algunos cambios necesarios para adaptarnos a la sintaxis diferente de bc, y teniendo en cuenta que la constante "0.9189..." es en realidad ln(2*PI)/2, esto se puede traducir al siguiente código GNU bc:

define phi ( x ) { auto s , t , b , q , i , const s = x ; t = 0 ; b = x ; q = x * x ; i = 1 mientras ( s != t ) s = ( t = s ) + ( b *= q / ( i += 2 )) const = 0.5 * l ( 8 * a ( 1 )) # 0.91893 ... return .5 + s * e ( - .5 * q - const ) }

Uso de bc en scripts de shell

bc se puede usar de forma no interactiva, con entrada a través de una tubería . Esto es útil dentro de scripts de shell . Por ejemplo:

$ resultado = $( echo "escala=2; 5 * 7 /3;" | bc ) $ echo $resultado 11.66

En cambio, tenga en cuenta que el intérprete de comandos bash solo realiza aritmética de enteros, por ejemplo:

$ resultado = $(( 5 * 7 / 3 )) $ echo $ resultado 11

También se puede utilizar el modismo here-string (en bash, ksh, csh):

$ antes de Cristo -l <<< "5*7/3" 11.66666666666666666666

Véase también

Referencias

  1. "Una implementación de Unix dc y POSIX bc con extensiones GNU y BSD" . Archivado del original el 16 de junio de 2024. Consultado el 16 de junio de 2024 .
  2. "Interfaz y utilidades de Android" . android.googlesource.com . Archivado del original el 16 de junio de 2024. Consultado el 16 de junio de 2024 .
  3. "Plataforma/Externa/Bc - Git en Google" . Archivado del original el 16 de junio de 2024. Consultado el 16 de junio de 2024 .
  4. "FreeBSD 13.3: ¿Qué hay de nuevo y cómo llegamos hasta aquí?" . Los foros de FreeBSD . 5 de marzo de 2024. Archivado del original el 16 de junio de 2024 . Consultado el 16 de junio de 2024 .
  5. "bc(1)" . man.freebsd.org . Archivado del original el 16-06-2024 . Recuperado el 16-06-2024 .
  6. "bc « contrib - src - Árbol fuente de FreeBSD" . cgit.freebsd.org . 
  7. "Apple Open Source" . opensource.apple.com .
  8. "bc/bc en main · apple-oss-distributions/bc" . GitHub .
  9. "¡Mi código conquistó otro sistema operativo! | Gavin D. Howard" . Archivado del original el 15 de julio de 2024. Consultado el 16 de junio de 2024 .
  10. Thompson, Ken ; Ritchie, Dennis (mayo de 1975). Manual del programador de Unix (sexta edición) (6.ª ed.). págs. 17–18 .  
  11. "Calculadora básica" . hy17-bc.spb.ctf.su . Archivado del original el 19 de julio de 2024. Consultado el 6 de octubre de 2025 .
  12. "BC - Calculadora de banco" . enlighttheworld.altervista.org . Consultado el 6 de octubre de 2025 .
  13. Winsor, Janice (agosto de 1999). Solaris™ 7 Reference . Pearson. pp. capítulo 2, nivel 1, sección 4. ISBN  978-0-13-020048-8Archivado del original el 31/08/2025 . Consultado el 06/10/2025 .
  14. 1 2 : lenguaje aritmético de precisión arbitraria Referencia de shell y utilidades, Especificación única de UNIX , versión 5 de The Open Groupbc   
  • bc Lenguaje aritmético de precisión arbitraria   Referencia  de shell y utilidades, Especificación única de UNIX , versión 5 de The Open Group
  • Página del manual de GNU bc archivada el 4 de octubre de 2018 en Wayback Machine.
  • Página del manual POSIX bc
  • bc(1) – Manual del programador de Plan 9 , Volumen 1 
  • Página del manual de Unix bc, 7.ª edición. Archivada el 8 de octubre de 2006 en Wayback Machine.
  • Artículo de comp.compilers sobre el diseño e implementación de C-bc. Archivado el 16 de mayo de 2006 en la Wayback Machine.
  • Sexta edición del código fuente de Unix bc , la primera versión de bc, de mayo de 1975, que compila la sintaxis de bc a sintaxis de dc.
  • Código fuente de GNU bc archivado el 29/07/2019 en Wayback Machine.
  • Dittmer, I. 1993. Error en los comandos 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 de GnuWin32
  • Gavin Howard bc : otra implementación de código abierto de bc por Gavin Howard con extensiones para GNU y BSD.
  • X-bc - Una interfaz gráfica de usuario para bc
    • extensions.bc - contiene funciones trigonométricas, 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.