# 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: