Before GUI Calculators

Sometimes these basic questions pop up that need me to seek the counsel of a calculations oracle. Because I am somewhat of a terminal hermit it helps to be able to have your math executed there as well. No GUI calcs, no REPLs for your favorite flavor languages – just simple math.

Logarithm of Something

In bc one can compute natural logarithms through the function l.

The natural logarithm of the Euler constant equals 1 $\ln(e) = 1$ and bc does its best to arrive at whatever value is closest considering rounding errors introduced through floating point arithmetic.

echo "l(e(1))" | bc -l

It helps to be aware of $\log_a(b) = \frac{\log_k(b)}{\log_k(a)}$ where $k$ is an arbitrary base. Considering that $\ln(x) = \log_e(x)$ and bc offers the natural logarithm function through its function l we can calculate any logarithm by leveraging the aforementioned property.

  • $\log_{10}(x) = \frac{\log_e(x)}{\log_e(10)}$ which may be described as l(x)/l(10)
  • $\log_2(x) = \frac{\log_e(x)}{\log_e(2)}$ which may be described as l(x)/l(2)

Change of base

The expression $\lfloor \log_{b}(q) \rfloor + 1$ is the answer to all How many digits in base $b$ are used to represent the value $q$ questions.

I pipe some statements to bc in the following manner to solve how many bits I would need to capture $44$:

echo "f=l(44)/l(2); scale=0; 1+(f/1)" | bc -l

If you want to know how many digits you would need to represent the decimal value $57$ in the octal (base 8) system we ask:

echo "f=l(57)/l(8); scale=0; 1+(f/1)" | bc -l

If I want to capture the amount of digits necessary to represent the decimal value $665$ in hex (base 16) I run:

echo "f=l(665)/l(16); scale=0; 1+(f/1)" | bc -l

The binary representation of any number?

Provided that we want to convert the decimal number $165$ to a binary number we can do the previous thing for base $2$ or simply execute:

echo "obase=2; 165" | bc

So simple :smile: