↑↑ Home | ↑ UNIX |

`bc` is an ancient UNIX command-line calculator that supports arbitrarily
large numbers, different bases and (with the `-l` option) fractional
computations and some transcendental functions. However a long-standing bug
causes wrong results with fractional numbers in a base other than 10.

The problem is in the input and output of fractional quantities in a general
base. You can easily check if your version of `bc` has these bugs:

bc -l <<EOF ibase=16 0.B B/10 0.0B/0.1 EOF

All these equal 11/16, so in the default output base `obase=10` and the
default precision `scale=20` the result should be `.6875`, possibly with
zeros appended. FreeBSD `bc` gets this right, but Gnu `bc` outputs 0.6 for
the first input and claims a division by zero for the last.

A similar discrepancy exists for output in bases other than 10. The input:

bc -l <<EOF obase=15 0.5 1/2 EOF

gives `.7` for the first row, and the correct `.777777777777777777` for
the second. This bug exists in both FreeBSD and Gnu `bc`.

Here is a patch for Gnu `bc` that fixes both issues.

As an aside, the maintainer of Gnu `bc` has replied with standards lawyering
when confronted with these bugs. Actually the
the
relevant part of the POSIX standard prescribes a precision of 10^{s}
on output, where s is the "scale of the value being output", which can be
interpreted as something other than `scale`. The standard has nothing to
say on input base conversion, which is completely open to even the most
braindead interpretation. Even if the standard was clear, this would be a case
of bug-for-bug
compatibility at best. Common sense (that a calculator should be
mathematically accurate or that the POSIX standard may assume mathematical
literacy in its readers) is of course an alien concept in IT, which explains
why a lot of software is such junk.