bc
suporta o logaritmo natural se invocado com o sinalizador -l
. Você pode calcular o log base-10 ou base-2 com ele:
$ bc -l
...
l(100)/l(10)
2.00000000000000000000
l(256)/l(2)
8.00000000000000000007
Eu não acho que há um fatorial embutido, mas isso é fácil o suficiente para se escrever:
$ 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
Ou:
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 ser compatível com POSIX, você precisa escrevê-lo:
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))
}
Ou seja: nome da função de caractere único, sem print
, sem halt
, parênteses exigidos em return(x)
. Se você não precisa de validação de entrada (aqui para números inteiros positivos), é apenas:
define f(n) {
if (n < 2) return(1)
return(n * f(n - 1))
}