bc: shrink internal library more
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 Dec 2018 08:53:50 +0000 (09:53 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 Dec 2018 08:53:50 +0000 (09:53 +0100)
function                                             old     new   delta
bc_lib                                              1618    1609      -9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c

index 0a2da6cf86007f26c2724c92ba05fe3e117283fd..8befc8e3f540a7a1fbc59c76d39e8ae50f6ad759 100644 (file)
@@ -7143,6 +7143,12 @@ static const char bc_lib[] ALIGN1 = {
        "scale=20"
 "\n"   "define e(x){"
 "\n"           "auto b,s,n,r,d,i,p,f,v"
+////////////////"if(x<0)return(1/e(-x))" // and drop 'n' and x<0 logic below
+//^^^^^^^^^^^^^^^^ this would work, and is even more precise than GNU bc:
+//e(-.998896): GNU:.36828580434569428695
+//      above code:.36828580434569428696
+//    actual value:.3682858043456942869594...
+// but for now let's be "GNU compatible"
 "\n"           "b=ibase"
 "\n"           "ibase=A"
 "\n"           "if(x<0){"
@@ -7219,7 +7225,7 @@ static const char bc_lib[] ALIGN1 = {
 "\n"           "}"
 "\n"           "scale=0"
 "\n"           "q=(x/a+2)/4"
-"\n"           "x=x-4*q*a"
+"\n"           "x-=4*q*a"
 "\n"           "if(q%2)x=-x"
 "\n"           "scale=s+2"
 "\n"           "r=a=x"
@@ -7288,7 +7294,7 @@ static const char bc_lib[] ALIGN1 = {
 "\n"           "n/=1"
 "\n"           "if(n<0){"
 "\n"                   "n=-n"
-"\n"                   "if(n%2==1)o=1"
+"\n"                   "o=n%2"
 "\n"           "}"
 "\n"           "a=1"
 "\n"           "for(i=2;i<=n;++i)a*=i"