↑↑ 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 10s
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.