5

I'm just starting with Gnu's bc and I'm stuck at the very beginning (very discouraging...). I want to divide two numbers and get a float as result:

$bc
bc 1.06.94
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 

15/12
1
15.0/12.0
1
15.000000/12.000000
1
scale(15.00000)
5

The man page says, that division returns a number with the same scale as the initial values. Obviously this is either not true or I'm missing something.

Googling hasn't brought up any new insights (besides that 'BC' can also stand for 'British Columbia').

Do you see my error? Better yet, do you know any good references/tutorials to bc?

4 Answers 4

8

You can set the scale with

scale=2

Then division works as expected:

scale=2
15/12
1.25

To quote from Wikipedia:

All numbers and variable contents are arbitrary precision numbers whose precision (in decimal places) is determined by the global scale variable.

5
  • Ah, that is the poodle's core. Can I set the scale globally in some .bcrc file?
    – Boldewyn
    Dec 18, 2009 at 12:26
  • Found it: export BC_ENV_ARGS=~/.bcrc
    – Boldewyn
    Dec 18, 2009 at 12:30
  • I doubt »Das also war des Pudels Kern [ein fahrender Scholast]« works reliably in other languages :-) At least I don't know how well-known Faust is in other languages :-)
    – Joey
    Dec 18, 2009 at 19:08
  • This was the poodle's real core, \\ A travelling scholar, then? The casus is diverting. Project Gutenberg ist dein Freund: gutenberg.org/files/14591/14591-h/14591-h.htm
    – Boldewyn
    Dec 21, 2009 at 17:13
  • But I must agree, and LEO.org suggests 'the gist of the matter' ;-)
    – Boldewyn
    Dec 21, 2009 at 17:14
7

Use bc -l, which preloads the math library and the default scale is set to 20.

$ bc -l
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
4/3
1.33333333333333333333
3

To expand on Colin_Daly, use BC_ENV_ARGS="-q $HOME/.bcrc", with scale=INT in .bcrc obviously. The environment variable is basically just stuck right after the bc command.

What's happening is that -q is just a normal command line option, and $HOME/.bcrc is expanded and fed into bc as the first file argument (there can be multiple file arguments). scale=INT is a line of bc, which is a programming language. It's functionally equivalent to running bc and entering scale=INT on the bc prompt. You have to use $HOME and not ~ because ~ is only recognized when it's not quoted (see here), but we need some sort of quoting so the variable is set to both words, not just up to the space.

1

In case this helps anyone, I was trying to get scale=2 and quiet mode set by default and I couldn't seem to get it right.

If I set BC_ENV_VARS="-q", I got quiet mode and if I set BC_ENV_VARS="~/.bcrc", I could set scale=2 in this file but I couldn't turn on quiet mode (maybe there is a way but I couldn't find it).

In the end I used export BC_ENV_ARGS=~/.bcrc (with scale=2) and aliased bc to bc -q.

1
  • You can do this export BC_ENV_ARGS="-q $HOME/.bcrc"
    – SebMa
    May 12, 2020 at 14:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .