¿bc no admite el registro y el cálculo factorial?


17

¿Hay alguna otra calculadora de línea de comandos que soporta log, n!cálculos? Al menos bcno puedo hacer eso, me dijo un error de análisis

Es mejor si pudiera usar script, por ejemplo echo '5!' | program

Respuestas:


20

bcadmite el logaritmo natural si se invoca con la -lbandera. Puede calcular el registro de base 10 o base 2 con él:

$ bc -l
...
l(100)/l(10)
2.00000000000000000000

l(256)/l(2)
8.00000000000000000007

No creo que haya un factorial incorporado, pero es bastante fácil de escribir usted mismo:

$ bc
...
define fact_rec (n) { 
  if (n < 0) {
    print "oops";
    halt;
  }
  if (n < 2) return 1;
  return n*fact_rec(n-1);
}
fact_rec(5)
120

O:

define fact_it (n) {
  if (n < 0) {
    print "oops";
    halt;
  }
  res = 1;
  for (; n > 1; n--) {
    res *= n;
  }
  return res;
}
fact_it(100)
93326215443944152681699238856266700490715968264381621468592963895217\
59999322991560894146397615651828625369792082722375825118521091686400\
0000000000000000000000

Para cumplir con POSIX, deberá escribirlo:

define f(n) {
  auto s, m
  if (n <= 0) {
    "Invalid input: "
    n
    return(-1)
  }
  s = scale
  scale = 0
  m = n / 1
  scale = s
  if (n != m) {
    "Invalid input: "
    n
    return(-1)
  }
  if (n < 2) return(1)
  return(n * f(n - 1))
}

Es decir: nombre de función de un solo carácter, no print, no halt, se requiere paréntesis en return(x). Si no necesita validación de entrada (aquí para números enteros positivos), es solo:

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}

1
comprobar n == 1 da como resultado un bucle sin fin si le das un número negativo o cero. use n <= 1 en su lugar como en la página de manual de bc. Realmente, sin embargo, debería devolver un error de números negativos, de acuerdo con en.wikipedia.org/wiki/... este es un problema conocido con el uso de la recursividad para calcular factoriales.
cas

esto no pretende ser un estudio sobre la implementación perfecta de factorial, solo una demostración simple para mostrar que bc tiene funciones, incluidas funciones recursivas.
Mat

cierto, pero alguien algún día leerá esa función de ejemplo y dirá "genial, me preguntaba cómo hacerlo" y la usará. Por cierto, estoy tan lejos de ser un geek matemático como puedes ser y sigo siendo un geek de la computadora ... pero como estaba corrigiendo un error, pensé que sería mejor investigar un poco primero :)
cas

Ok, ahí lo tienes. Corregir versiones recursivas e iterativas ...
Mat

no del todo correcto: 0!=1igual que 1!=1. Al menos, eso es lo que dice Wikipedia.
cas

4

Orpie es la calculadora para calculadores y geeks de línea de comando. Emula una calculadora HP RPN moderna, que por supuesto es la única forma real de calcular.

Si usted es un calculador hereje, criado en TI, Casios y demás, hay muchos tutoriales RPN en línea con los que puede comenzar su reeducación. El manual de Orpie finalmente será de alguna utilidad para usted, una vez que obtenga la forma de pensar RPN.

Para calcular 5! en Orpie, sólo tiene que escribir que a medida que iba a escribir que: 5 !. Puede presionar Enterentre ellos para empujar 5primero a la pila, pero no es necesario.

Para calcular el registro 10 (5), escriba 5 Enter ' l o Enter. En 5este caso, primero debe empujar la pila hacia la pila, ya que la siguiente pulsación de tecla no es un operador. Ese carácter de comillas simples ingresa al modo de abreviatura de comando, que le permite comenzar a escribir log10, que puede identificar únicamente con los dos primeros caracteres. ( lsolo obtienes la función de registro natural ln).

Como con cualquier calculadora RPN, puedes ser realmente rápido con Orpie, con un poco de práctica.

Orpie está en los repositorios de Ubuntu. FreeBSD lo incluye en Puertos, como math/orpie. En OS X, puede instalarlo a través de Homebrew . Los paquetes de terceros pueden estar disponibles para otros sistemas operativos. Construir desde la fuente puede ser un poco complicado, ya que está escrito en OCaml , y probablemente no tenga instalado un entorno de desarrollo OCaml. Sin embargo, configurar uno no es particularmente difícil.


2

Siempre hay GNU Octave , los emacs de las calculadoras de línea de comandos (para cuando quieres un entorno de desarrollo completo y un lenguaje de programación integrado en tu calculadora, y miles de complementos opcionales)

o R si las estadísticas son más tuyas.

Principalmente solo uso bc -lpara cargar la biblioteca matemática estándar ... Incluso me he bcalias bc -l. Consulte la respuesta de Mat para obtener información sobre bccómo definir una función factorial ... aunque la página del manual la define como:

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

La comprobación de <= 1 en lugar de == 1 evita un bucle sin fin si le da un número negativo (debería ser un error) o cero (válido).


1

Mi favorito es el ligero, simple W-Calc. http://w-calc.sourceforge.net

No tiene que buscar en el manual o volver a crear manualmente funciones comunes, como lo hace con bc: los comandos son en su mayoría exactamente lo que esperaría, así que simplemente escriba lo que desee y simplemente funciona. Pruebas según su pregunta, de hecho, log()y n!trabaje como se espera.

(Es cierto que no he oído hablar de Orpie, muy bien puede ser una mejor opción).


0

Totalmente excesivo, pero los intérpretes de lenguaje de programación son calculadoras de línea de comando después de todo:

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.