bc: do not disallow powers to N.0000 degree - it's even shorter code
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Dec 2018 20:45:18 +0000 (21:45 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Dec 2018 20:45:18 +0000 (21:45 +0100)
function                                             old     new   delta
zbc_num_p                                            440     424     -16

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

index 876244b34c38d08f1b624149d105642768cf0734..d7595ce8ef4c310824f7105b52e44bce1cdfc3dc 100644 (file)
@@ -2089,7 +2089,8 @@ static FAST_FUNC BC_STATUS zbc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size
        size_t i, powrdx, resrdx;
        bool neg;
 
-       if (b->rdx) RETURN_STATUS(bc_error("non integer number"));
+// GNU bc does not allow 2^2.0. We do.
+//     if (b->rdx) RETURN_STATUS(bc_error("non integer number"));
 
        if (b->len == 0) {
                bc_num_one(c);
@@ -2109,9 +2110,10 @@ static FAST_FUNC BC_STATUS zbc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size
 
        neg = b->neg;
        b->neg = false;
-
        s = zbc_num_ulong(b, &pow);
+       b->neg = neg;
        if (s) RETURN_STATUS(s);
+       // b is not used beyond this point
 
        bc_num_init(&copy, a->len);
        bc_num_copy(&copy, a);
@@ -2123,7 +2125,6 @@ static FAST_FUNC BC_STATUS zbc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size
                        scale = a->rdx * pow;
        }
 
-       b->neg = neg;
 
        for (powrdx = a->rdx; !(pow & 1); pow >>= 1) {
                powrdx <<= 1;