new mirror
[hband-tools.git] / lib / functions.bc
blob4ed90e2feabe3d3d39fe09c74ed76c04aef150bd
1 #!/usr/bin/bc
3 # Author:
4 #   http://www.pixelbeat.org/
5 # Description:
6 #   Integer functions I've found useful while
7 #   systems programming in the unix environment.
8 # Notes:
9 #   I only use bc when python is not available.
10 #   Personally I have this file in ~/bin/bc so
11 #   that I can just invoke bc as normal and have these
12 #   extra functions available.
13 # Changes:
14 #   V0.1, 11 Apr 2007, Initial release
15 # Contribution:
16 #   13 Feb 2011, Andreas Hrubak, factor() and binom() added
17 #   17 Jan 2017, Andreas Hrubak, anot() and dbzeqz() added
20 define factor(x) {
21         /* factorial product */
22         if (x <= 1) return (1)
23         return factor(x-1) * x
25 define binom(n,k) {
26         /* binominal product */
27         return factor(n) / (factor(n-k)*factor(k))
31 define min(x,y) {
32         if (x<y) return x
33         return y
36 define max(x,y) {
37         if (x>y) return x
38         return y
41 define abs(x) {
42         if (x<0) return -x
43         return x
46 /* take integer part */
47 define int(x) {
48         auto old_scale   /* variables global by default */
49         old_scale=scale  /* scale is global */
50         scale=0
51         ret=x/1
52         scale=old_scale
53         return ret
56 /* round to nearest integer */
57 define round(x) {
58         if (x<0) x-=.5 else x+=.5
59         return int(x)
62 /* smallest integer >= arg */
63 define ceil(x) {
64         auto intx
65         intx=int(x)
66         if (intx<x) intx+=1
67         return intx
70 /* largest integer <= arg */
71 define floor(x) {
72         return -ceil(-x)
75 /* round x to previous multiple of y */
76 define round_down(x,y) {
77         return y*floor(x/y)
80 /* round x to next multiple of y */
81 define round_up(x,y) {
82         return y*ceil(x/y)
85 /* round x to nearest multiple of y */
86 define round_to(x,y) {
87         return y*round(x/y)
90 /* Greatest Common Divisor or Highest Common Factor of x and y */
91 /* Note when people say Lowest Common Denominator they usually mean this */
92 define gcd(x,y) {
93          if (y==0) return x
94          return gcd(y,x%y) /* anything that divides into x and y also divides into the remainder of x/y */
97 /* Lowest Common Multiple of x and y */
98 /* Lowest Common Denominator of fractions is LCM of the denominators */
99 define lcm(x,y) {
100         return (x*y) / gcd(x,y)
104 /* Signum */
105 define sgn(x) {
106         if (x<0) return -1
107         if (x>0) return 1
108         return 0
111 /* Logical Negation expressed in Arithmetic way */
112 define anot(x) {
113         return abs(sgn(abs(x))-1)
116 /* Let Division By Zero equal to Zero */
117 define dbzeqz(p,d) {
118         return (p-(anot(d)*p)) / (d+anot(d))