How is bc different from dc?

dc is a very archaic tool and somewhat older than bc. To quote the Wikipedia page:

It is one of the oldest Unix utilities, predating even the invention of the C programming language; like other utilities of that vintage, it has a powerful set of features but an extremely terse syntax.

The syntax is a reverse polish notation, which basically means that the arguments (ie numbers) come first followed by the operator. A basic example of the dc usage is:

echo '3 4 * p' | dc

Where the p is required to print the result of the calculation. bc on the other hand uses the more familiar infix notation and thus is more intuitive to use. Here is an example of bc usage:

echo '3 * 4' | bc

Which one to use?

bc is standardised by POSIX and so is probably the more portable of the two (at least on modern systems). If you are doing manual calculator work then it is definitely the choice (unless you are somewhat of a masochist). dc can still have its uses though, here is a case where the reverse polish notation comes in handy. Imagine you have a program which outputs a stream of numbers that you want to total up, eg:

23
7
90
74
29

To do this with dc is very simple (at least with modern implementations where each operator can take more than two numbers) since you only have to append a +p to the stream, eg:

{ gen_nums; echo +p } | dc

But with bc it is more complex since we not only need to put a + between each number and make sure everything is on the same line, but also make sure there is a newline at the end:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

A basic difference between the two is that dc uses the reverse Polish notation. It requires explicit commands even in order to produce an output.

You might add two integers in bc by saying:

bc <<< "2+4"

and it would produce 6 on a line by itself. However, in dc you'd need to say:

dc <<< "2 4 +p"

You can also do much fun stuff using dc, e.g. refer to my answer here for producing

Hello World!

using dc.

dc<<<"8 9*P101P108P108P111P4 8*P81 6+P111P114P108P100P33P"


dc is a calculator whereas bc is an actual language. See their man pages.

dc

dc is a reverse-polish desk calculator which supports unlimited precision arithmetic. It also allows you to define and call macros. Normally dc reads from the standard input; if any command arguments are given to it, they are filenames, and dc reads and executes the contents of the files before reading from standard input. All normal output is to standard output; all error output is to standard error.

bc

bc is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language. A standard math library is available by command line option. If requested, the math library is defined before processing any files. bc starts by processing code from all the files listed on the command line in the order listed. After all files have been processed, bc reads from the standard input. All code is executed as it is read. (If a file contains a command to halt the processor, bc will never read from the standard input.)

It really depends on what you're ultimately wanting to do mathematically. Some operations aren't possible using dc. I've used both over the years in addition to several other command-line calculator tools. See "Command line expression solver?" for some additional examples.