How is bc different from dc?

What are the differences between dc and bc calculators?

When should I use dc and when bc?

• I use expr very often for simple calculations on the command line and in scripts. – MattBianco Apr 25 '14 at 14:47

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
• You've turned the gen_nums example horribly complex using bc. It could be simplified to: gen_nums | paste -sd+ | bc – devnull Apr 13 '14 at 10:22
• Fun fact: Traditionally bc was only a front end tool that compiled the bc notation to the notation of dc and piped that into dc to get the result. On FreeBSD there is still the -c flag for bc with which you can still compile to the dc notation. For example echo '3 * 4' | bc` is equal to echo '3 * 4' | bc -c | dc. See the linux.die.net/man/1/bc and freebsd.org/cgi/man.cgi?query=bc&sektion=1 – Raphael Ahrens Apr 14 '14 at 10:24
• Hmm, which dc are you using? On Ubuntu 14.04 and OS X, the + operator always operates on exactly two values off the stack – Digital Trauma Mar 25 '15 at 19:01
• The correct example of dc usage: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. This script for dc reads and adds numbers one by one in loop and then prints the result. See the note regarding negative numbers. – ruvim Oct 19 '15 at 15:08
• @RaphaelAhrens Interesting, on macOS bc -c does something weird and different (and the -c flag is undocumented). If I try to pipe it into dc, I get a bunch of errors (and the output without piping into dc is the very cryptic @iK3:K4:*W@r\n@i). – Konrad Rudolph Jun 26 '18 at 13:00

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"

• "Bc was written as a front-end to Dc" – Adam Apr 25 '14 at 15:43

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.

• @REACHUS - I'm not sure I understand what you're asking? Due to dc being a reverse polish notation calculator and since I've always used HP reverse polish notation calculators I actually prefer using dc to bc but I would say they're both still used anytime you need to perform a complex mathematical calculation. I often use them to convert numbers b/w base 10 to base 16 and base 2. But have used them to tally columns in tabular data as well from within an AWK script. – slm Apr 13 '14 at 12:23
• bc was a language in the sense that it made dc human-friendly - not that it was more powerful. These days the apps share libs, but bc was called a language and dc a calculator because dc did math and bc spoke math - to dc. Here's an older man page: A language called BC [1] has been developed which accepts programs written in higher-level languages and compiles output which is interpreted by DC. Some of the commands described below were designed for the compiler interface and are not easy for a human user to manipulate. – mikeserv Feb 15 '15 at 14:34
• I claim dc is also a language. e.g. codegolf.stackexchange.com/a/47921/11259 – Digital Trauma Mar 25 '15 at 19:02
• @DigitalTrauma To argue that it isn't a language would be absurd since it has a lexer and parser. But to argue it's human readable, given that example, would be absurd. I mean... damn. – Parthian Shot Jul 6 '15 at 22:22
• @ParthianShot Agreed. My reading of "dc is a calculator whereas bc is an actual language" is that slm is implying that dc is not a language, which I am disagreeing with. But I might just be reading into the answer wrong... – Digital Trauma Jul 6 '15 at 23:11

In my humble opinion and in as few words as possible, GNU dc differs from GNU bc in 3 ways:

1) If bc's math library is out of concern, to save as many keystrokes as possible (in Jan Łukasiewicz's words: a parenthesis-free notation) when doing elementary arithmetic, to concentrate more on the essentials and to avoid distractions.

2) In Microsoft Windows 7's command line, GNU dc consumes less memory (~ 320K) than GNU bc does (~ 360K).

3) Much granular control in GNU dc than in GNU bc, for example, stack and register commands are absent from GNU bc.

Version 1.07.1 win32 for both is at https://embedeo.org/ws/command_line/bc_dc_calculator_windows/