1 /* 2 * ***************************************************************************** 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 * 6 * Copyright (c) 2018-2021 Gavin D. Howard and contributors. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * * Redistributions of source code must retain the above copyright notice, this 12 * list of conditions and the following disclaimer. 13 * 14 * * Redistributions in binary form must reproduce the above copyright notice, 15 * this list of conditions and the following disclaimer in the documentation 16 * and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 * 30 * ***************************************************************************** 31 * 32 * Code for the number type. 33 * 34 */ 35 36 #include <assert.h> 37 #include <ctype.h> 38 #include <stdbool.h> 39 #include <stdlib.h> 40 #include <string.h> 41 #include <setjmp.h> 42 #include <limits.h> 43 44 #include <num.h> 45 #include <rand.h> 46 #include <vm.h> 47 48 // Before you try to understand this code, see the development manual 49 // (manuals/development.md#numbers). 50 51 static void bc_num_m(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale); 52 53 /** 54 * Multiply two numbers and throw a math error if they overflow. 55 * @param a The first operand. 56 * @param b The second operand. 57 * @return The product of the two operands. 58 */ 59 static inline size_t bc_num_mulOverflow(size_t a, size_t b) { 60 size_t res = a * b; 61 if (BC_ERR(BC_VM_MUL_OVERFLOW(a, b, res))) bc_err(BC_ERR_MATH_OVERFLOW); 62 return res; 63 } 64 65 /** 66 * Conditionally negate @a n based on @a neg. Algorithm taken from 67 * https://graphics.stanford.edu/~seander/bithacks.html#ConditionalNegate . 68 * @param n The value to turn into a signed value and negate. 69 * @param neg The condition to negate or not. 70 */ 71 static inline ssize_t bc_num_neg(size_t n, bool neg) { 72 return (((ssize_t) n) ^ -((ssize_t) neg)) + neg; 73 } 74 75 /** 76 * Compare a BcNum against zero. 77 * @param n The number to compare. 78 * @return -1 if the number is less than 0, 1 if greater, and 0 if equal. 79 */ 80 ssize_t bc_num_cmpZero(const BcNum *n) { 81 return bc_num_neg((n)->len != 0, BC_NUM_NEG(n)); 82 } 83 84 /** 85 * Return the number of integer limbs in a BcNum. This is the opposite of rdx. 86 * @param n The number to return the amount of integer limbs for. 87 * @return The amount of integer limbs in @a n. 88 */ 89 static inline size_t bc_num_int(const BcNum *n) { 90 return n->len ? n->len - BC_NUM_RDX_VAL(n) : 0; 91 } 92 93 /** 94 * Expand a number's allocation capacity to at least req limbs. 95 * @param n The number to expand. 96 * @param req The number limbs to expand the allocation capacity to. 97 */ 98 static void bc_num_expand(BcNum *restrict n, size_t req) { 99 100 assert(n != NULL); 101 102 req = req >= BC_NUM_DEF_SIZE ? req : BC_NUM_DEF_SIZE; 103 104 if (req > n->cap) { 105 106 BC_SIG_LOCK; 107 108 n->num = bc_vm_realloc(n->num, BC_NUM_SIZE(req)); 109 n->cap = req; 110 111 BC_SIG_UNLOCK; 112 } 113 } 114 115 /** 116 * Set a number to 0 with the specified scale. 117 * @param n The number to set to zero. 118 * @param scale The scale to set the number to. 119 */ 120 static void bc_num_setToZero(BcNum *restrict n, size_t scale) { 121 assert(n != NULL); 122 n->scale = scale; 123 n->len = n->rdx = 0; 124 } 125 126 void bc_num_zero(BcNum *restrict n) { 127 bc_num_setToZero(n, 0); 128 } 129 130 void bc_num_one(BcNum *restrict n) { 131 bc_num_zero(n); 132 n->len = 1; 133 n->num[0] = 1; 134 } 135 136 /** 137 * "Cleans" a number, which means reducing the length if the most significant 138 * limbs are zero. 139 * @param n The number to clean. 140 */ 141 static void bc_num_clean(BcNum *restrict n) { 142 143 // Reduce the length. 144 while (BC_NUM_NONZERO(n) && !n->num[n->len - 1]) n->len -= 1; 145 146 // Special cases. 147 if (BC_NUM_ZERO(n)) n->rdx = 0; 148 else { 149 150 // len must be at least as much as rdx. 151 size_t rdx = BC_NUM_RDX_VAL(n); 152 if (n->len < rdx) n->len = rdx; 153 } 154 } 155 156 /** 157 * Returns the log base 10 of @a i. I could have done this with floating-point 158 * math, and in fact, I originally did. However, that was the only 159 * floating-point code in the entire codebase, and I decided I didn't want any. 160 * This is fast enough. Also, it might handle larger numbers better. 161 * @param i The number to return the log base 10 of. 162 * @return The log base 10 of @a i. 163 */ 164 static size_t bc_num_log10(size_t i) { 165 size_t len; 166 for (len = 1; i; i /= BC_BASE, ++len); 167 assert(len - 1 <= BC_BASE_DIGS + 1); 168 return len - 1; 169 } 170 171 /** 172 * Returns the number of decimal digits in a limb that are zero starting at the 173 * most significant digits. This basically returns how much of the limb is used. 174 * @param n The number. 175 * @return The number of decimal digits that are 0 starting at the most 176 * significant digits. 177 */ 178 static inline size_t bc_num_zeroDigits(const BcDig *n) { 179 assert(*n >= 0); 180 assert(((size_t) *n) < BC_BASE_POW); 181 return BC_BASE_DIGS - bc_num_log10((size_t) *n); 182 } 183 184 /** 185 * Return the total number of integer digits in a number. This is the opposite 186 * of scale, like bc_num_int() is the opposite of rdx. 187 * @param n The number. 188 * @return The number of integer digits in @a n. 189 */ 190 static size_t bc_num_intDigits(const BcNum *n) { 191 size_t digits = bc_num_int(n) * BC_BASE_DIGS; 192 if (digits > 0) digits -= bc_num_zeroDigits(n->num + n->len - 1); 193 return digits; 194 } 195 196 /** 197 * Returns the number of limbs of a number that are non-zero starting at the 198 * most significant limbs. This expects that there are *no* integer limbs in the 199 * number because it is specifically to figure out how many zero limbs after the 200 * decimal place to ignore. If there are zero limbs after non-zero limbs, they 201 * are counted as non-zero limbs. 202 * @param n The number. 203 * @return The number of non-zero limbs after the decimal point. 204 */ 205 static size_t bc_num_nonZeroLen(const BcNum *restrict n) { 206 size_t i, len = n->len; 207 assert(len == BC_NUM_RDX_VAL(n)); 208 for (i = len - 1; i < len && !n->num[i]; --i); 209 assert(i + 1 > 0); 210 return i + 1; 211 } 212 213 /** 214 * Performs a one-limb add with a carry. 215 * @param a The first limb. 216 * @param b The second limb. 217 * @param carry An in/out parameter; the carry in from the previous add and the 218 * carry out from this add. 219 * @return The resulting limb sum. 220 */ 221 static BcDig bc_num_addDigits(BcDig a, BcDig b, bool *carry) { 222 223 assert(((BcBigDig) BC_BASE_POW) * 2 == ((BcDig) BC_BASE_POW) * 2); 224 assert(a < BC_BASE_POW); 225 assert(b < BC_BASE_POW); 226 227 a += b + *carry; 228 *carry = (a >= BC_BASE_POW); 229 if (*carry) a -= BC_BASE_POW; 230 231 assert(a >= 0); 232 assert(a < BC_BASE_POW); 233 234 return a; 235 } 236 237 /** 238 * Performs a one-limb subtract with a carry. 239 * @param a The first limb. 240 * @param b The second limb. 241 * @param carry An in/out parameter; the carry in from the previous subtract 242 * and the carry out from this subtract. 243 * @return The resulting limb difference. 244 */ 245 static BcDig bc_num_subDigits(BcDig a, BcDig b, bool *carry) { 246 247 assert(a < BC_BASE_POW); 248 assert(b < BC_BASE_POW); 249 250 b += *carry; 251 *carry = (a < b); 252 if (*carry) a += BC_BASE_POW; 253 254 assert(a - b >= 0); 255 assert(a - b < BC_BASE_POW); 256 257 return a - b; 258 } 259 260 /** 261 * Add two BcDig arrays and store the result in the first array. 262 * @param a The first operand and out array. 263 * @param b The second operand. 264 * @param len The length of @a b. 265 */ 266 static void bc_num_addArrays(BcDig *restrict a, const BcDig *restrict b, 267 size_t len) 268 { 269 size_t i; 270 bool carry = false; 271 272 for (i = 0; i < len; ++i) a[i] = bc_num_addDigits(a[i], b[i], &carry); 273 274 // Take care of the extra limbs in the bigger array. 275 for (; carry; ++i) a[i] = bc_num_addDigits(a[i], 0, &carry); 276 } 277 278 /** 279 * Subtract two BcDig arrays and store the result in the first array. 280 * @param a The first operand and out array. 281 * @param b The second operand. 282 * @param len The length of @a b. 283 */ 284 static void bc_num_subArrays(BcDig *restrict a, const BcDig *restrict b, 285 size_t len) 286 { 287 size_t i; 288 bool carry = false; 289 290 for (i = 0; i < len; ++i) a[i] = bc_num_subDigits(a[i], b[i], &carry); 291 292 // Take care of the extra limbs in the bigger array. 293 for (; carry; ++i) a[i] = bc_num_subDigits(a[i], 0, &carry); 294 } 295 296 /** 297 * Multiply a BcNum array by a one-limb number. This is a faster version of 298 * multiplication for when we can use it. 299 * @param a The BcNum to multiply by the one-limb number. 300 * @param b The one limb of the one-limb number. 301 * @param c The return parameter. 302 */ 303 static void bc_num_mulArray(const BcNum *restrict a, BcBigDig b, 304 BcNum *restrict c) 305 { 306 size_t i; 307 BcBigDig carry = 0; 308 309 assert(b <= BC_BASE_POW); 310 311 // Make sure the return parameter is big enough. 312 if (a->len + 1 > c->cap) bc_num_expand(c, a->len + 1); 313 314 // We want the entire return parameter to be zero for cleaning later. 315 memset(c->num, 0, BC_NUM_SIZE(c->cap)); 316 317 // Actual multiplication loop. 318 for (i = 0; i < a->len; ++i) { 319 BcBigDig in = ((BcBigDig) a->num[i]) * b + carry; 320 c->num[i] = in % BC_BASE_POW; 321 carry = in / BC_BASE_POW; 322 } 323 324 assert(carry < BC_BASE_POW); 325 326 // Finishing touches. 327 c->num[i] = (BcDig) carry; 328 c->len = a->len; 329 c->len += (carry != 0); 330 331 bc_num_clean(c); 332 333 // Postconditions. 334 assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c)); 335 assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len); 336 assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len); 337 } 338 339 /** 340 * Divide a BcNum array by a one-limb number. This is a faster version of divide 341 * for when we can use it. 342 * @param a The BcNum to multiply by the one-limb number. 343 * @param b The one limb of the one-limb number. 344 * @param c The return parameter for the quotient. 345 * @param rem The return parameter for the remainder. 346 */ 347 static void bc_num_divArray(const BcNum *restrict a, BcBigDig b, 348 BcNum *restrict c, BcBigDig *rem) 349 { 350 size_t i; 351 BcBigDig carry = 0; 352 353 assert(c->cap >= a->len); 354 355 // Actual division loop. 356 for (i = a->len - 1; i < a->len; --i) { 357 BcBigDig in = ((BcBigDig) a->num[i]) + carry * BC_BASE_POW; 358 assert(in / b < BC_BASE_POW); 359 c->num[i] = (BcDig) (in / b); 360 carry = in % b; 361 } 362 363 // Finishing touches. 364 c->len = a->len; 365 bc_num_clean(c); 366 *rem = carry; 367 368 // Postconditions. 369 assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c)); 370 assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len); 371 assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len); 372 } 373 374 /** 375 * Compare two BcDig arrays and return >0 if @a b is greater, <0 if @a b is 376 * less, and 0 if equal. Both @a a and @a b must have the same length. 377 * @param a The first array. 378 * @param b The second array. 379 * @param len The minimum length of the arrays. 380 */ 381 static ssize_t bc_num_compare(const BcDig *restrict a, const BcDig *restrict b, 382 size_t len) 383 { 384 size_t i; 385 BcDig c = 0; 386 for (i = len - 1; i < len && !(c = a[i] - b[i]); --i); 387 return bc_num_neg(i + 1, c < 0); 388 } 389 390 ssize_t bc_num_cmp(const BcNum *a, const BcNum *b) { 391 392 size_t i, min, a_int, b_int, diff, ardx, brdx; 393 BcDig *max_num, *min_num; 394 bool a_max, neg = false; 395 ssize_t cmp; 396 397 assert(a != NULL && b != NULL); 398 399 // Same num? Equal. 400 if (a == b) return 0; 401 402 // Easy cases. 403 if (BC_NUM_ZERO(a)) return bc_num_neg(b->len != 0, !BC_NUM_NEG(b)); 404 if (BC_NUM_ZERO(b)) return bc_num_cmpZero(a); 405 if (BC_NUM_NEG(a)) { 406 if (BC_NUM_NEG(b)) neg = true; 407 else return -1; 408 } 409 else if (BC_NUM_NEG(b)) return 1; 410 411 // Get the number of int limbs in each number and get the difference. 412 a_int = bc_num_int(a); 413 b_int = bc_num_int(b); 414 a_int -= b_int; 415 416 // If there's a difference, then just return the comparison. 417 if (a_int) return neg ? -((ssize_t) a_int) : (ssize_t) a_int; 418 419 // Get the rdx's and figure out the max. 420 ardx = BC_NUM_RDX_VAL(a); 421 brdx = BC_NUM_RDX_VAL(b); 422 a_max = (ardx > brdx); 423 424 // Set variables based on the above. 425 if (a_max) { 426 min = brdx; 427 diff = ardx - brdx; 428 max_num = a->num + diff; 429 min_num = b->num; 430 } 431 else { 432 min = ardx; 433 diff = brdx - ardx; 434 max_num = b->num + diff; 435 min_num = a->num; 436 } 437 438 // Do a full limb-by-limb comparison. 439 cmp = bc_num_compare(max_num, min_num, b_int + min); 440 441 // If we found a difference, return it based on state. 442 if (cmp) return bc_num_neg((size_t) cmp, !a_max == !neg); 443 444 // If there was no difference, then the final step is to check which number 445 // has greater or lesser limbs beyond the other's. 446 for (max_num -= diff, i = diff - 1; i < diff; --i) { 447 if (max_num[i]) return bc_num_neg(1, !a_max == !neg); 448 } 449 450 return 0; 451 } 452 453 void bc_num_truncate(BcNum *restrict n, size_t places) { 454 455 size_t nrdx, places_rdx; 456 457 if (!places) return; 458 459 // Grab these needed values; places_rdx is the rdx equivalent to places like 460 // rdx is to scale. 461 nrdx = BC_NUM_RDX_VAL(n); 462 places_rdx = nrdx ? nrdx - BC_NUM_RDX(n->scale - places) : 0; 463 464 // We cannot truncate more places than we have. 465 assert(places <= n->scale && (BC_NUM_ZERO(n) || places_rdx <= n->len)); 466 467 n->scale -= places; 468 BC_NUM_RDX_SET(n, nrdx - places_rdx); 469 470 // Only when the number is nonzero do we need to do the hard stuff. 471 if (BC_NUM_NONZERO(n)) { 472 473 size_t pow; 474 475 // This calculates how many decimal digits are in the least significant 476 // limb. 477 pow = n->scale % BC_BASE_DIGS; 478 pow = pow ? BC_BASE_DIGS - pow : 0; 479 pow = bc_num_pow10[pow]; 480 481 n->len -= places_rdx; 482 483 // We have to move limbs to maintain invariants. The limbs must begin at 484 // the beginning of the BcNum array. 485 memmove(n->num, n->num + places_rdx, BC_NUM_SIZE(n->len)); 486 487 // Clear the lower part of the last digit. 488 if (BC_NUM_NONZERO(n)) n->num[0] -= n->num[0] % (BcDig) pow; 489 490 bc_num_clean(n); 491 } 492 } 493 494 void bc_num_extend(BcNum *restrict n, size_t places) { 495 496 size_t nrdx, places_rdx; 497 498 if (!places) return; 499 500 // Easy case with zero; set the scale. 501 if (BC_NUM_ZERO(n)) { 502 n->scale += places; 503 return; 504 } 505 506 // Grab these needed values; places_rdx is the rdx equivalent to places like 507 // rdx is to scale. 508 nrdx = BC_NUM_RDX_VAL(n); 509 places_rdx = BC_NUM_RDX(places + n->scale) - nrdx; 510 511 // This is the hard case. We need to expand the number, move the limbs, and 512 // set the limbs that were just cleared. 513 if (places_rdx) { 514 bc_num_expand(n, bc_vm_growSize(n->len, places_rdx)); 515 memmove(n->num + places_rdx, n->num, BC_NUM_SIZE(n->len)); 516 memset(n->num, 0, BC_NUM_SIZE(places_rdx)); 517 } 518 519 // Finally, set scale and rdx. 520 BC_NUM_RDX_SET(n, nrdx + places_rdx); 521 n->scale += places; 522 n->len += places_rdx; 523 524 assert(BC_NUM_RDX_VAL(n) == BC_NUM_RDX(n->scale)); 525 } 526 527 /** 528 * Retires (finishes) a multiplication or division operation. 529 */ 530 static void bc_num_retireMul(BcNum *restrict n, size_t scale, 531 bool neg1, bool neg2) 532 { 533 // Make sure scale is correct. 534 if (n->scale < scale) bc_num_extend(n, scale - n->scale); 535 else bc_num_truncate(n, n->scale - scale); 536 537 bc_num_clean(n); 538 539 // We need to ensure rdx is correct. 540 if (BC_NUM_NONZERO(n)) n->rdx = BC_NUM_NEG_VAL(n, !neg1 != !neg2); 541 } 542 543 /** 544 * Splits a number into two BcNum's. This is used in Karatsuba. 545 * @param n The number to split. 546 * @param idx The index to split at. 547 * @param a An out parameter; the low part of @a n. 548 * @param b An out parameter; the high part of @a n. 549 */ 550 static void bc_num_split(const BcNum *restrict n, size_t idx, 551 BcNum *restrict a, BcNum *restrict b) 552 { 553 // We want a and b to be clear. 554 assert(BC_NUM_ZERO(a)); 555 assert(BC_NUM_ZERO(b)); 556 557 // The usual case. 558 if (idx < n->len) { 559 560 // Set the fields first. 561 b->len = n->len - idx; 562 a->len = idx; 563 a->scale = b->scale = 0; 564 BC_NUM_RDX_SET(a, 0); 565 BC_NUM_RDX_SET(b, 0); 566 567 assert(a->cap >= a->len); 568 assert(b->cap >= b->len); 569 570 // Copy the arrays. This is not necessary for safety, but it is faster, 571 // for some reason. 572 memcpy(b->num, n->num + idx, BC_NUM_SIZE(b->len)); 573 memcpy(a->num, n->num, BC_NUM_SIZE(idx)); 574 575 bc_num_clean(b); 576 } 577 // If the index is weird, just skip the split. 578 else bc_num_copy(a, n); 579 580 bc_num_clean(a); 581 } 582 583 /** 584 * Copies a number into another, but shifts the rdx so that the result number 585 * only sees the integer part of the source number. 586 * @param n The number to copy. 587 * @param r The result number with a shifted rdx, len, and num. 588 */ 589 static void bc_num_shiftRdx(const BcNum *restrict n, BcNum *restrict r) { 590 591 size_t rdx = BC_NUM_RDX_VAL(n); 592 593 r->len = n->len - rdx; 594 r->cap = n->cap - rdx; 595 r->num = n->num + rdx; 596 597 BC_NUM_RDX_SET_NEG(r, 0, BC_NUM_NEG(n)); 598 r->scale = 0; 599 } 600 601 /** 602 * Shifts a number so that all of the least significant limbs of the number are 603 * skipped. This must be undone by bc_num_unshiftZero(). 604 * @param n The number to shift. 605 */ 606 static size_t bc_num_shiftZero(BcNum *restrict n) { 607 608 size_t i; 609 610 // If we don't have an integer, that is a problem, but it's also a bug 611 // because the caller should have set everything up right. 612 assert(!BC_NUM_RDX_VAL(n) || BC_NUM_ZERO(n)); 613 614 for (i = 0; i < n->len && !n->num[i]; ++i); 615 616 n->len -= i; 617 n->num += i; 618 619 return i; 620 } 621 622 /** 623 * Undo the damage done by bc_num_unshiftZero(). This must be called like all 624 * cleanup functions: after a label used by setjmp() and longjmp(). 625 * @param n The number to unshift. 626 * @param places_rdx The amount the number was originally shift. 627 */ 628 static void bc_num_unshiftZero(BcNum *restrict n, size_t places_rdx) { 629 n->len += places_rdx; 630 n->num -= places_rdx; 631 } 632 633 /** 634 * Shifts the digits right within a number by no more than BC_BASE_DIGS - 1. 635 * This is the final step on shifting numbers with the shift operators. It 636 * depends on the caller to shift the limbs properly because all it does is 637 * ensure that the rdx point is realigned to be between limbs. 638 * @param n The number to shift digits in. 639 * @param dig The number of places to shift right. 640 */ 641 static void bc_num_shift(BcNum *restrict n, BcBigDig dig) { 642 643 size_t i, len = n->len; 644 BcBigDig carry = 0, pow; 645 BcDig *ptr = n->num; 646 647 assert(dig < BC_BASE_DIGS); 648 649 // Figure out the parameters for division. 650 pow = bc_num_pow10[dig]; 651 dig = bc_num_pow10[BC_BASE_DIGS - dig]; 652 653 // Run a series of divisions and mods with carries across the entire number 654 // array. This effectively shifts everything over. 655 for (i = len - 1; i < len; --i) { 656 BcBigDig in, temp; 657 in = ((BcBigDig) ptr[i]); 658 temp = carry * dig; 659 carry = in % pow; 660 ptr[i] = ((BcDig) (in / pow)) + (BcDig) temp; 661 } 662 663 assert(!carry); 664 } 665 666 /** 667 * Shift a number left by a certain number of places. This is the workhorse of 668 * the left shift operator. 669 * @param n The number to shift left. 670 * @param places The amount of places to shift @a n left by. 671 */ 672 static void bc_num_shiftLeft(BcNum *restrict n, size_t places) { 673 674 BcBigDig dig; 675 size_t places_rdx; 676 bool shift; 677 678 if (!places) return; 679 680 // Make sure to grow the number if necessary. 681 if (places > n->scale) { 682 size_t size = bc_vm_growSize(BC_NUM_RDX(places - n->scale), n->len); 683 if (size > SIZE_MAX - 1) bc_err(BC_ERR_MATH_OVERFLOW); 684 } 685 686 // If zero, we can just set the scale and bail. 687 if (BC_NUM_ZERO(n)) { 688 if (n->scale >= places) n->scale -= places; 689 else n->scale = 0; 690 return; 691 } 692 693 // When I changed bc to have multiple digits per limb, this was the hardest 694 // code to change. This and shift right. Make sure you understand this 695 // before attempting anything. 696 697 // This is how many limbs we will shift. 698 dig = (BcBigDig) (places % BC_BASE_DIGS); 699 shift = (dig != 0); 700 701 // Convert places to a rdx value. 702 places_rdx = BC_NUM_RDX(places); 703 704 // If the number is not an integer, we need special care. The reason an 705 // integer doesn't is because left shift would only extend the integer, 706 // whereas a non-integer might have its fractional part eliminated or only 707 // partially eliminated. 708 if (n->scale) { 709 710 size_t nrdx = BC_NUM_RDX_VAL(n); 711 712 // If the number's rdx is bigger, that's the hard case. 713 if (nrdx >= places_rdx) { 714 715 size_t mod = n->scale % BC_BASE_DIGS, revdig; 716 717 // We want mod to be in the range [1, BC_BASE_DIGS], not 718 // [0, BC_BASE_DIGS). 719 mod = mod ? mod : BC_BASE_DIGS; 720 721 // We need to reverse dig to get the actual number of digits. 722 revdig = dig ? BC_BASE_DIGS - dig : 0; 723 724 // If the two overflow BC_BASE_DIGS, we need to move an extra place. 725 if (mod + revdig > BC_BASE_DIGS) places_rdx = 1; 726 else places_rdx = 0; 727 } 728 else places_rdx -= nrdx; 729 } 730 731 // If this is non-zero, we need an extra place, so expand, move, and set. 732 if (places_rdx) { 733 bc_num_expand(n, bc_vm_growSize(n->len, places_rdx)); 734 memmove(n->num + places_rdx, n->num, BC_NUM_SIZE(n->len)); 735 memset(n->num, 0, BC_NUM_SIZE(places_rdx)); 736 n->len += places_rdx; 737 } 738 739 // Set the scale appropriately. 740 if (places > n->scale) { 741 n->scale = 0; 742 BC_NUM_RDX_SET(n, 0); 743 } 744 else { 745 n->scale -= places; 746 BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale)); 747 } 748 749 // Finally, shift within limbs. 750 if (shift) bc_num_shift(n, BC_BASE_DIGS - dig); 751 752 bc_num_clean(n); 753 } 754 755 void bc_num_shiftRight(BcNum *restrict n, size_t places) { 756 757 BcBigDig dig; 758 size_t places_rdx, scale, scale_mod, int_len, expand; 759 bool shift; 760 761 if (!places) return; 762 763 // If zero, we can just set the scale and bail. 764 if (BC_NUM_ZERO(n)) { 765 n->scale += places; 766 bc_num_expand(n, BC_NUM_RDX(n->scale)); 767 return; 768 } 769 770 // Amount within a limb we have to shift by. 771 dig = (BcBigDig) (places % BC_BASE_DIGS); 772 shift = (dig != 0); 773 774 scale = n->scale; 775 776 // Figure out how the scale is affected. 777 scale_mod = scale % BC_BASE_DIGS; 778 scale_mod = scale_mod ? scale_mod : BC_BASE_DIGS; 779 780 // We need to know the int length and rdx for places. 781 int_len = bc_num_int(n); 782 places_rdx = BC_NUM_RDX(places); 783 784 // If we are going to shift past a limb boundary or not, set accordingly. 785 if (scale_mod + dig > BC_BASE_DIGS) { 786 expand = places_rdx - 1; 787 places_rdx = 1; 788 } 789 else { 790 expand = places_rdx; 791 places_rdx = 0; 792 } 793 794 // Clamp expanding. 795 if (expand > int_len) expand -= int_len; 796 else expand = 0; 797 798 // Extend, expand, and zero. 799 bc_num_extend(n, places_rdx * BC_BASE_DIGS); 800 bc_num_expand(n, bc_vm_growSize(expand, n->len)); 801 memset(n->num + n->len, 0, BC_NUM_SIZE(expand)); 802 803 // Set the fields. 804 n->len += expand; 805 n->scale = 0; 806 BC_NUM_RDX_SET(n, 0); 807 808 // Finally, shift within limbs. 809 if (shift) bc_num_shift(n, dig); 810 811 n->scale = scale + places; 812 BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale)); 813 814 bc_num_clean(n); 815 816 assert(BC_NUM_RDX_VAL(n) <= n->len && n->len <= n->cap); 817 assert(BC_NUM_RDX_VAL(n) == BC_NUM_RDX(n->scale)); 818 } 819 820 /** 821 * Invert @a into @a b at the current scale. 822 * @param a The number to invert. 823 * @param b The return parameter. This must be preallocated. 824 * @param scale The current scale. 825 */ 826 static inline void bc_num_inv(BcNum *a, BcNum *b, size_t scale) { 827 assert(BC_NUM_NONZERO(a)); 828 bc_num_div(&vm.one, a, b, scale); 829 } 830 831 /** 832 * Tests if a number is a integer with scale or not. Returns true if the number 833 * is not an integer. If it is, its integer shifted form is copied into the 834 * result parameter for use where only integers are allowed. 835 * @param n The integer to test and shift. 836 * @param r The number to store the shifted result into. This number should 837 * *not* be allocated. 838 * @return True if the number is a non-integer, false otherwise. 839 */ 840 static bool bc_num_nonInt(const BcNum *restrict n, BcNum *restrict r) { 841 842 bool zero; 843 size_t i, rdx = BC_NUM_RDX_VAL(n); 844 845 if (!rdx) { 846 memcpy(r, n, sizeof(BcNum)); 847 return false; 848 } 849 850 zero = true; 851 852 for (i = 0; zero && i < rdx; ++i) zero = (n->num[i] == 0); 853 854 if (BC_ERR(!zero)) return true; 855 856 bc_num_shiftRdx(n, r); 857 858 return false; 859 } 860 861 #if BC_ENABLE_EXTRA_MATH 862 863 /** 864 * Execute common code for an operater that needs an integer for the second 865 * operand and return the integer operand as a BcBigDig. 866 * @param a The first operand. 867 * @param b The second operand. 868 * @param c The result operand. 869 * @return The second operand as a hardware integer. 870 */ 871 static BcBigDig bc_num_intop(const BcNum *a, const BcNum *b, BcNum *restrict c) 872 { 873 BcNum temp; 874 875 if (BC_ERR(bc_num_nonInt(b, &temp))) bc_err(BC_ERR_MATH_NON_INTEGER); 876 877 bc_num_copy(c, a); 878 879 return bc_num_bigdig(&temp); 880 } 881 #endif // BC_ENABLE_EXTRA_MATH 882 883 /** 884 * This is the actual implementation of add *and* subtract. Since this function 885 * doesn't need to use scale (per the bc spec), I am hijacking it to say whether 886 * it's doing an add or a subtract. And then I convert substraction to addition 887 * of negative second operand. This is a BcNumBinOp function. 888 * @param a The first operand. 889 * @param b The second operand. 890 * @param c The return parameter. 891 * @param sub Non-zero for a subtract, zero for an add. 892 */ 893 static void bc_num_as(BcNum *a, BcNum *b, BcNum *restrict c, size_t sub) { 894 895 BcDig *ptr_c, *ptr_l, *ptr_r; 896 size_t i, min_rdx, max_rdx, diff, a_int, b_int, min_len, max_len, max_int; 897 size_t len_l, len_r, ardx, brdx; 898 bool b_neg, do_sub, do_rev_sub, carry, c_neg; 899 900 if (BC_NUM_ZERO(b)) { 901 bc_num_copy(c, a); 902 return; 903 } 904 905 if (BC_NUM_ZERO(a)) { 906 bc_num_copy(c, b); 907 c->rdx = BC_NUM_NEG_VAL(c, BC_NUM_NEG(b) != sub); 908 return; 909 } 910 911 // Invert sign of b if it is to be subtracted. This operation must 912 // precede the tests for any of the operands being zero. 913 b_neg = (BC_NUM_NEG(b) != sub); 914 915 // Figure out if we will actually add the numbers if their signs are equal 916 // or subtract. 917 do_sub = (BC_NUM_NEG(a) != b_neg); 918 919 a_int = bc_num_int(a); 920 b_int = bc_num_int(b); 921 max_int = BC_MAX(a_int, b_int); 922 923 // Figure out which number will have its last limbs copied (for addition) or 924 // subtracted (for subtraction). 925 ardx = BC_NUM_RDX_VAL(a); 926 brdx = BC_NUM_RDX_VAL(b); 927 min_rdx = BC_MIN(ardx, brdx); 928 max_rdx = BC_MAX(ardx, brdx); 929 diff = max_rdx - min_rdx; 930 931 max_len = max_int + max_rdx; 932 933 if (do_sub) { 934 935 // Check whether b has to be subtracted from a or a from b. 936 if (a_int != b_int) do_rev_sub = (a_int < b_int); 937 else if (ardx > brdx) 938 do_rev_sub = (bc_num_compare(a->num + diff, b->num, b->len) < 0); 939 else 940 do_rev_sub = (bc_num_compare(a->num, b->num + diff, a->len) <= 0); 941 } 942 else { 943 944 // The result array of the addition might come out one element 945 // longer than the bigger of the operand arrays. 946 max_len += 1; 947 do_rev_sub = (a_int < b_int); 948 } 949 950 assert(max_len <= c->cap); 951 952 // Cache values for simple code later. 953 if (do_rev_sub) { 954 ptr_l = b->num; 955 ptr_r = a->num; 956 len_l = b->len; 957 len_r = a->len; 958 } 959 else { 960 ptr_l = a->num; 961 ptr_r = b->num; 962 len_l = a->len; 963 len_r = b->len; 964 } 965 966 ptr_c = c->num; 967 carry = false; 968 969 // This is true if the numbers have a different number of limbs after the 970 // decimal point. 971 if (diff) { 972 973 // If the rdx values of the operands do not match, the result will 974 // have low end elements that are the positive or negative trailing 975 // elements of the operand with higher rdx value. 976 if ((ardx > brdx) != do_rev_sub) { 977 978 // !do_rev_sub && ardx > brdx || do_rev_sub && brdx > ardx 979 // The left operand has BcDig values that need to be copied, 980 // either from a or from b (in case of a reversed subtraction). 981 memcpy(ptr_c, ptr_l, BC_NUM_SIZE(diff)); 982 ptr_l += diff; 983 len_l -= diff; 984 } 985 else { 986 987 // The right operand has BcDig values that need to be copied 988 // or subtracted from zero (in case of a subtraction). 989 if (do_sub) { 990 991 // do_sub (do_rev_sub && ardx > brdx || 992 // !do_rev_sub && brdx > ardx) 993 for (i = 0; i < diff; i++) 994 ptr_c[i] = bc_num_subDigits(0, ptr_r[i], &carry); 995 } 996 else { 997 998 // !do_sub && brdx > ardx 999 memcpy(ptr_c, ptr_r, BC_NUM_SIZE(diff)); 1000 } 1001 1002 // Future code needs to ignore the limbs we just did. 1003 ptr_r += diff; 1004 len_r -= diff; 1005 } 1006 1007 // The return value pointer needs to ignore what we just did. 1008 ptr_c += diff; 1009 } 1010 1011 // This is the length that can be directly added/subtracted. 1012 min_len = BC_MIN(len_l, len_r); 1013 1014 // After dealing with possible low array elements that depend on only one 1015 // operand above, the actual add or subtract can be performed as if the rdx 1016 // of both operands was the same. 1017 // 1018 // Inlining takes care of eliminating constant zero arguments to 1019 // addDigit/subDigit (checked in disassembly of resulting bc binary 1020 // compiled with gcc and clang). 1021 if (do_sub) { 1022 1023 // Actual subtraction. 1024 for (i = 0; i < min_len; ++i) 1025 ptr_c[i] = bc_num_subDigits(ptr_l[i], ptr_r[i], &carry); 1026 1027 // Finishing the limbs beyond the direct subtraction. 1028 for (; i < len_l; ++i) ptr_c[i] = bc_num_subDigits(ptr_l[i], 0, &carry); 1029 } 1030 else { 1031 1032 // Actual addition. 1033 for (i = 0; i < min_len; ++i) 1034 ptr_c[i] = bc_num_addDigits(ptr_l[i], ptr_r[i], &carry); 1035 1036 // Finishing the limbs beyond the direct addition. 1037 for (; i < len_l; ++i) ptr_c[i] = bc_num_addDigits(ptr_l[i], 0, &carry); 1038 1039 // Addition can create an extra limb. We take care of that here. 1040 ptr_c[i] = bc_num_addDigits(0, 0, &carry); 1041 } 1042 1043 assert(carry == false); 1044 1045 // The result has the same sign as a, unless the operation was a 1046 // reverse subtraction (b - a). 1047 c_neg = BC_NUM_NEG(a) != (do_sub && do_rev_sub); 1048 BC_NUM_RDX_SET_NEG(c, max_rdx, c_neg); 1049 c->len = max_len; 1050 c->scale = BC_MAX(a->scale, b->scale); 1051 1052 bc_num_clean(c); 1053 } 1054 1055 /** 1056 * The simple multiplication that karatsuba dishes out to when the length of the 1057 * numbers gets low enough. This doesn't use scale because it treats the 1058 * operands as though they are integers. 1059 * @param a The first operand. 1060 * @param b The second operand. 1061 * @param c The return parameter. 1062 */ 1063 static void bc_num_m_simp(const BcNum *a, const BcNum *b, BcNum *restrict c) { 1064 1065 size_t i, alen = a->len, blen = b->len, clen; 1066 BcDig *ptr_a = a->num, *ptr_b = b->num, *ptr_c; 1067 BcBigDig sum = 0, carry = 0; 1068 1069 assert(sizeof(sum) >= sizeof(BcDig) * 2); 1070 assert(!BC_NUM_RDX_VAL(a) && !BC_NUM_RDX_VAL(b)); 1071 1072 // Make sure c is big enough. 1073 clen = bc_vm_growSize(alen, blen); 1074 bc_num_expand(c, bc_vm_growSize(clen, 1)); 1075 1076 // If we don't memset, then we might have uninitialized data use later. 1077 ptr_c = c->num; 1078 memset(ptr_c, 0, BC_NUM_SIZE(c->cap)); 1079 1080 // This is the actual multiplication loop. It uses the lattice form of long 1081 // multiplication (see the explanation on the web page at 1082 // https://knilt.arcc.albany.edu/What_is_Lattice_Multiplication or the 1083 // explanation at Wikipedia). 1084 for (i = 0; i < clen; ++i) { 1085 1086 ssize_t sidx = (ssize_t) (i - blen + 1); 1087 size_t j, k; 1088 1089 // These are the start indices. 1090 j = (size_t) BC_MAX(0, sidx); 1091 k = BC_MIN(i, blen - 1); 1092 1093 // On every iteration of this loop, a multiplication happens, then the 1094 // sum is automatically calculated. 1095 for (; j < alen && k < blen; ++j, --k) { 1096 1097 sum += ((BcBigDig) ptr_a[j]) * ((BcBigDig) ptr_b[k]); 1098 1099 if (sum >= ((BcBigDig) BC_BASE_POW) * BC_BASE_POW) { 1100 carry += sum / BC_BASE_POW; 1101 sum %= BC_BASE_POW; 1102 } 1103 } 1104 1105 // Calculate the carry. 1106 if (sum >= BC_BASE_POW) { 1107 carry += sum / BC_BASE_POW; 1108 sum %= BC_BASE_POW; 1109 } 1110 1111 // Store and set up for next iteration. 1112 ptr_c[i] = (BcDig) sum; 1113 assert(ptr_c[i] < BC_BASE_POW); 1114 sum = carry; 1115 carry = 0; 1116 } 1117 1118 // This should always be true because there should be no carry on the last 1119 // digit; multiplication never goes above the sum of both lengths. 1120 assert(!sum); 1121 1122 c->len = clen; 1123 } 1124 1125 /** 1126 * Does a shifted add or subtract for Karatsuba below. This calls either 1127 * bc_num_addArrays() or bc_num_subArrays(). 1128 * @param n An in/out parameter; the first operand and return parameter. 1129 * @param a The second operand. 1130 * @param shift The amount to shift @a n by when adding/subtracting. 1131 * @param op The function to call, either bc_num_addArrays() or 1132 * bc_num_subArrays(). 1133 */ 1134 static void bc_num_shiftAddSub(BcNum *restrict n, const BcNum *restrict a, 1135 size_t shift, BcNumShiftAddOp op) 1136 { 1137 assert(n->len >= shift + a->len); 1138 assert(!BC_NUM_RDX_VAL(n) && !BC_NUM_RDX_VAL(a)); 1139 op(n->num + shift, a->num, a->len); 1140 } 1141 1142 /** 1143 * Implements the Karatsuba algorithm. 1144 */ 1145 static void bc_num_k(const BcNum *a, const BcNum *b, BcNum *restrict c) { 1146 1147 size_t max, max2, total; 1148 BcNum l1, h1, l2, h2, m2, m1, z0, z1, z2, temp; 1149 BcDig *digs, *dig_ptr; 1150 BcNumShiftAddOp op; 1151 bool aone = BC_NUM_ONE(a); 1152 1153 assert(BC_NUM_ZERO(c)); 1154 1155 if (BC_NUM_ZERO(a) || BC_NUM_ZERO(b)) return; 1156 1157 if (aone || BC_NUM_ONE(b)) { 1158 bc_num_copy(c, aone ? b : a); 1159 if ((aone && BC_NUM_NEG(a)) || BC_NUM_NEG(b)) BC_NUM_NEG_TGL(c); 1160 return; 1161 } 1162 1163 // Shell out to the simple algorithm with certain conditions. 1164 if (a->len < BC_NUM_KARATSUBA_LEN || b->len < BC_NUM_KARATSUBA_LEN) { 1165 bc_num_m_simp(a, b, c); 1166 return; 1167 } 1168 1169 // We need to calculate the max size of the numbers that can result from the 1170 // operations. 1171 max = BC_MAX(a->len, b->len); 1172 max = BC_MAX(max, BC_NUM_DEF_SIZE); 1173 max2 = (max + 1) / 2; 1174 1175 // Calculate the space needed for all of the temporary allocations. We do 1176 // this to just allocate once. 1177 total = bc_vm_arraySize(BC_NUM_KARATSUBA_ALLOCS, max); 1178 1179 BC_SIG_LOCK; 1180 1181 // Allocate space for all of the temporaries. 1182 digs = dig_ptr = bc_vm_malloc(BC_NUM_SIZE(total)); 1183 1184 // Set up the temporaries. 1185 bc_num_setup(&l1, dig_ptr, max); 1186 dig_ptr += max; 1187 bc_num_setup(&h1, dig_ptr, max); 1188 dig_ptr += max; 1189 bc_num_setup(&l2, dig_ptr, max); 1190 dig_ptr += max; 1191 bc_num_setup(&h2, dig_ptr, max); 1192 dig_ptr += max; 1193 bc_num_setup(&m1, dig_ptr, max); 1194 dig_ptr += max; 1195 bc_num_setup(&m2, dig_ptr, max); 1196 1197 // Some temporaries need the ability to grow, so we allocate them 1198 // separately. 1199 max = bc_vm_growSize(max, 1); 1200 bc_num_init(&z0, max); 1201 bc_num_init(&z1, max); 1202 bc_num_init(&z2, max); 1203 max = bc_vm_growSize(max, max) + 1; 1204 bc_num_init(&temp, max); 1205 1206 BC_SETJMP_LOCKED(err); 1207 1208 BC_SIG_UNLOCK; 1209 1210 // First, set up c. 1211 bc_num_expand(c, max); 1212 c->len = max; 1213 memset(c->num, 0, BC_NUM_SIZE(c->len)); 1214 1215 // Split the parameters. 1216 bc_num_split(a, max2, &l1, &h1); 1217 bc_num_split(b, max2, &l2, &h2); 1218 1219 // Do the subtraction. 1220 bc_num_sub(&h1, &l1, &m1, 0); 1221 bc_num_sub(&l2, &h2, &m2, 0); 1222 1223 // The if statements below are there for efficiency reasons. The best way to 1224 // understand them is to understand the Karatsuba algorithm because now that 1225 // the ollocations and splits are done, the algorithm is pretty 1226 // straightforward. 1227 1228 if (BC_NUM_NONZERO(&h1) && BC_NUM_NONZERO(&h2)) { 1229 1230 assert(BC_NUM_RDX_VALID_NP(h1)); 1231 assert(BC_NUM_RDX_VALID_NP(h2)); 1232 1233 bc_num_m(&h1, &h2, &z2, 0); 1234 bc_num_clean(&z2); 1235 1236 bc_num_shiftAddSub(c, &z2, max2 * 2, bc_num_addArrays); 1237 bc_num_shiftAddSub(c, &z2, max2, bc_num_addArrays); 1238 } 1239 1240 if (BC_NUM_NONZERO(&l1) && BC_NUM_NONZERO(&l2)) { 1241 1242 assert(BC_NUM_RDX_VALID_NP(l1)); 1243 assert(BC_NUM_RDX_VALID_NP(l2)); 1244 1245 bc_num_m(&l1, &l2, &z0, 0); 1246 bc_num_clean(&z0); 1247 1248 bc_num_shiftAddSub(c, &z0, max2, bc_num_addArrays); 1249 bc_num_shiftAddSub(c, &z0, 0, bc_num_addArrays); 1250 } 1251 1252 if (BC_NUM_NONZERO(&m1) && BC_NUM_NONZERO(&m2)) { 1253 1254 assert(BC_NUM_RDX_VALID_NP(m1)); 1255 assert(BC_NUM_RDX_VALID_NP(m1)); 1256 1257 bc_num_m(&m1, &m2, &z1, 0); 1258 bc_num_clean(&z1); 1259 1260 op = (BC_NUM_NEG_NP(m1) != BC_NUM_NEG_NP(m2)) ? 1261 bc_num_subArrays : bc_num_addArrays; 1262 bc_num_shiftAddSub(c, &z1, max2, op); 1263 } 1264 1265 err: 1266 BC_SIG_MAYLOCK; 1267 free(digs); 1268 bc_num_free(&temp); 1269 bc_num_free(&z2); 1270 bc_num_free(&z1); 1271 bc_num_free(&z0); 1272 BC_LONGJMP_CONT; 1273 } 1274 1275 /** 1276 * Does checks for Karatsuba. It also changes things to ensure that the 1277 * Karatsuba and simple multiplication can treat the numbers as integers. This 1278 * is a BcNumBinOp function. 1279 * @param a The first operand. 1280 * @param b The second operand. 1281 * @param c The return parameter. 1282 * @param scale The current scale. 1283 */ 1284 static void bc_num_m(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1285 1286 BcNum cpa, cpb; 1287 size_t ascale, bscale, ardx, brdx, azero = 0, bzero = 0, zero, len, rscale; 1288 1289 assert(BC_NUM_RDX_VALID(a)); 1290 assert(BC_NUM_RDX_VALID(b)); 1291 1292 bc_num_zero(c); 1293 1294 ascale = a->scale; 1295 bscale = b->scale; 1296 1297 // This sets the final scale according to the bc spec. 1298 scale = BC_MAX(scale, ascale); 1299 scale = BC_MAX(scale, bscale); 1300 rscale = ascale + bscale; 1301 scale = BC_MIN(rscale, scale); 1302 1303 // If this condition is true, we can use bc_num_mulArray(), which would be 1304 // much faster. 1305 if ((a->len == 1 || b->len == 1) && !a->rdx && !b->rdx) { 1306 1307 BcNum *operand; 1308 BcBigDig dig; 1309 1310 // Set the correct operands. 1311 if (a->len == 1) { 1312 dig = (BcBigDig) a->num[0]; 1313 operand = b; 1314 } 1315 else { 1316 dig = (BcBigDig) b->num[0]; 1317 operand = a; 1318 } 1319 1320 bc_num_mulArray(operand, dig, c); 1321 1322 // Need to make sure the sign is correct. 1323 if (BC_NUM_NONZERO(c)) 1324 c->rdx = BC_NUM_NEG_VAL(c, BC_NUM_NEG(a) != BC_NUM_NEG(b)); 1325 1326 return; 1327 } 1328 1329 assert(BC_NUM_RDX_VALID(a)); 1330 assert(BC_NUM_RDX_VALID(b)); 1331 1332 BC_SIG_LOCK; 1333 1334 // We need copies because of all of the mutation needed to make Karatsuba 1335 // think the numbers are integers. 1336 bc_num_init(&cpa, a->len + BC_NUM_RDX_VAL(a)); 1337 bc_num_init(&cpb, b->len + BC_NUM_RDX_VAL(b)); 1338 1339 BC_SETJMP_LOCKED(err); 1340 1341 BC_SIG_UNLOCK; 1342 1343 bc_num_copy(&cpa, a); 1344 bc_num_copy(&cpb, b); 1345 1346 assert(BC_NUM_RDX_VALID_NP(cpa)); 1347 assert(BC_NUM_RDX_VALID_NP(cpb)); 1348 1349 BC_NUM_NEG_CLR_NP(cpa); 1350 BC_NUM_NEG_CLR_NP(cpb); 1351 1352 assert(BC_NUM_RDX_VALID_NP(cpa)); 1353 assert(BC_NUM_RDX_VALID_NP(cpb)); 1354 1355 // These are what makes them appear like integers. 1356 ardx = BC_NUM_RDX_VAL_NP(cpa) * BC_BASE_DIGS; 1357 bc_num_shiftLeft(&cpa, ardx); 1358 1359 brdx = BC_NUM_RDX_VAL_NP(cpb) * BC_BASE_DIGS; 1360 bc_num_shiftLeft(&cpb, brdx); 1361 1362 // We need to reset the jump here because azero and bzero are used in the 1363 // cleanup, and local variables are not guaranteed to be the same after a 1364 // jump. 1365 BC_SIG_LOCK; 1366 1367 BC_UNSETJMP; 1368 1369 // We want to ignore zero limbs. 1370 azero = bc_num_shiftZero(&cpa); 1371 bzero = bc_num_shiftZero(&cpb); 1372 1373 BC_SETJMP_LOCKED(err); 1374 1375 BC_SIG_UNLOCK; 1376 1377 bc_num_clean(&cpa); 1378 bc_num_clean(&cpb); 1379 1380 bc_num_k(&cpa, &cpb, c); 1381 1382 // The return parameter needs to have its scale set. This is the start. It 1383 // also needs to be shifted by the same amount as a and b have limbs after 1384 // the decimal point. 1385 zero = bc_vm_growSize(azero, bzero); 1386 len = bc_vm_growSize(c->len, zero); 1387 1388 bc_num_expand(c, len); 1389 1390 // Shift c based on the limbs after the decimal point in a and b. 1391 bc_num_shiftLeft(c, (len - c->len) * BC_BASE_DIGS); 1392 bc_num_shiftRight(c, ardx + brdx); 1393 1394 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b)); 1395 1396 err: 1397 BC_SIG_MAYLOCK; 1398 bc_num_unshiftZero(&cpb, bzero); 1399 bc_num_free(&cpb); 1400 bc_num_unshiftZero(&cpa, azero); 1401 bc_num_free(&cpa); 1402 BC_LONGJMP_CONT; 1403 } 1404 1405 /** 1406 * Returns true if the BcDig array has non-zero limbs, false otherwise. 1407 * @param a The array to test. 1408 * @param len The length of the array. 1409 * @return True if @a has any non-zero limbs, false otherwise. 1410 */ 1411 static bool bc_num_nonZeroDig(BcDig *restrict a, size_t len) { 1412 size_t i; 1413 bool nonzero = false; 1414 for (i = len - 1; !nonzero && i < len; --i) nonzero = (a[i] != 0); 1415 return nonzero; 1416 } 1417 1418 /** 1419 * Compares a BcDig array against a BcNum. This is especially suited for 1420 * division. Returns >0 if @a a is greater than @a b, <0 if it is less, and =0 1421 * if they are equal. 1422 * @param a The array. 1423 * @param b The number. 1424 * @param len The length to assume the arrays are. This is always less than the 1425 * actual length because of how this is implemented. 1426 */ 1427 static ssize_t bc_num_divCmp(const BcDig *a, const BcNum *b, size_t len) { 1428 1429 ssize_t cmp; 1430 1431 if (b->len > len && a[len]) cmp = bc_num_compare(a, b->num, len + 1); 1432 else if (b->len <= len) { 1433 if (a[len]) cmp = 1; 1434 else cmp = bc_num_compare(a, b->num, len); 1435 } 1436 else cmp = -1; 1437 1438 return cmp; 1439 } 1440 1441 /** 1442 * Extends the two operands of a division by BC_BASE_DIGS minus the number of 1443 * digits in the divisor estimate. In other words, it is shifting the numbers in 1444 * order to force the divisor estimate to fill the limb. 1445 * @param a The first operand. 1446 * @param b The second operand. 1447 * @param divisor The divisor estimate. 1448 */ 1449 static void bc_num_divExtend(BcNum *restrict a, BcNum *restrict b, 1450 BcBigDig divisor) 1451 { 1452 size_t pow; 1453 1454 assert(divisor < BC_BASE_POW); 1455 1456 pow = BC_BASE_DIGS - bc_num_log10((size_t) divisor); 1457 1458 bc_num_shiftLeft(a, pow); 1459 bc_num_shiftLeft(b, pow); 1460 } 1461 1462 /** 1463 * Actually does division. This is a rewrite of my original code by Stefan Esser 1464 * from FreeBSD. 1465 * @param a The first operand. 1466 * @param b The second operand. 1467 * @param c The return parameter. 1468 * @param scale The current scale. 1469 */ 1470 static void bc_num_d_long(BcNum *restrict a, BcNum *restrict b, 1471 BcNum *restrict c, size_t scale) 1472 { 1473 BcBigDig divisor; 1474 size_t len, end, i, rdx; 1475 BcNum cpb; 1476 bool nonzero = false; 1477 1478 assert(b->len < a->len); 1479 1480 len = b->len; 1481 end = a->len - len; 1482 1483 assert(len >= 1); 1484 1485 // This is a final time to make sure c is big enough and that its array is 1486 // properly zeroed. 1487 bc_num_expand(c, a->len); 1488 memset(c->num, 0, c->cap * sizeof(BcDig)); 1489 1490 // Setup. 1491 BC_NUM_RDX_SET(c, BC_NUM_RDX_VAL(a)); 1492 c->scale = a->scale; 1493 c->len = a->len; 1494 1495 // This is pulling the most significant limb of b in order to establish a 1496 // good "estimate" for the actual divisor. 1497 divisor = (BcBigDig) b->num[len - 1]; 1498 1499 // The entire bit of code in this if statement is to tighten the estimate of 1500 // the divisor. The condition asks if b has any other non-zero limbs. 1501 if (len > 1 && bc_num_nonZeroDig(b->num, len - 1)) { 1502 1503 // This takes a little bit of understanding. The "10*BC_BASE_DIGS/6+1" 1504 // results in either 16 for 64-bit 9-digit limbs or 7 for 32-bit 4-digit 1505 // limbs. Then it shifts a 1 by that many, which in both cases, puts the 1506 // result above *half* of the max value a limb can store. Basically, 1507 // this quickly calculates if the divisor is greater than half the max 1508 // of a limb. 1509 nonzero = (divisor > 1 << ((10 * BC_BASE_DIGS) / 6 + 1)); 1510 1511 // If the divisor is *not* greater than half the limb... 1512 if (!nonzero) { 1513 1514 // Extend the parameters by the number of missing digits in the 1515 // divisor. 1516 bc_num_divExtend(a, b, divisor); 1517 1518 // Check bc_num_d(). In there, we grow a again and again. We do it 1519 // again here; we *always* want to be sure it is big enough. 1520 len = BC_MAX(a->len, b->len); 1521 bc_num_expand(a, len + 1); 1522 1523 // Make a have a zero most significant limb to match the len. 1524 if (len + 1 > a->len) a->len = len + 1; 1525 1526 // Grab the new divisor estimate, new because the shift has made it 1527 // different. 1528 len = b->len; 1529 end = a->len - len; 1530 divisor = (BcBigDig) b->num[len - 1]; 1531 1532 nonzero = bc_num_nonZeroDig(b->num, len - 1); 1533 } 1534 } 1535 1536 // If b has other nonzero limbs, we want the divisor to be one higher, so 1537 // that it is an upper bound. 1538 divisor += nonzero; 1539 1540 // Make sure c can fit the new length. 1541 bc_num_expand(c, a->len); 1542 memset(c->num, 0, BC_NUM_SIZE(c->cap)); 1543 1544 assert(c->scale >= scale); 1545 rdx = BC_NUM_RDX_VAL(c) - BC_NUM_RDX(scale); 1546 1547 BC_SIG_LOCK; 1548 1549 bc_num_init(&cpb, len + 1); 1550 1551 BC_SETJMP_LOCKED(err); 1552 1553 BC_SIG_UNLOCK; 1554 1555 // This is the actual division loop. 1556 for (i = end - 1; i < end && i >= rdx && BC_NUM_NONZERO(a); --i) { 1557 1558 ssize_t cmp; 1559 BcDig *n; 1560 BcBigDig result; 1561 1562 n = a->num + i; 1563 assert(n >= a->num); 1564 result = 0; 1565 1566 cmp = bc_num_divCmp(n, b, len); 1567 1568 // This is true if n is greater than b, which means that division can 1569 // proceed, so this inner loop is the part that implements one instance 1570 // of the division. 1571 while (cmp >= 0) { 1572 1573 BcBigDig n1, dividend, quotient; 1574 1575 // These should be named obviously enough. Just imagine that it's a 1576 // division of one limb. Because that's what it is. 1577 n1 = (BcBigDig) n[len]; 1578 dividend = n1 * BC_BASE_POW + (BcBigDig) n[len - 1]; 1579 quotient = (dividend / divisor); 1580 1581 // If this is true, then we can just subtract. Remember: setting 1582 // quotient to 1 is not bad because we already know that n is 1583 // greater than b. 1584 if (quotient <= 1) { 1585 quotient = 1; 1586 bc_num_subArrays(n, b->num, len); 1587 } 1588 else { 1589 1590 assert(quotient <= BC_BASE_POW); 1591 1592 // We need to multiply and subtract for a quotient above 1. 1593 bc_num_mulArray(b, (BcBigDig) quotient, &cpb); 1594 bc_num_subArrays(n, cpb.num, cpb.len); 1595 } 1596 1597 // The result is the *real* quotient, by the way, but it might take 1598 // multiple trips around this loop to get it. 1599 result += quotient; 1600 assert(result <= BC_BASE_POW); 1601 1602 // And here's why it might take multiple trips: n might *still* be 1603 // greater than b. So we have to loop again. That's what this is 1604 // setting up for: the condition of the while loop. 1605 if (nonzero) cmp = bc_num_divCmp(n, b, len); 1606 else cmp = -1; 1607 } 1608 1609 assert(result < BC_BASE_POW); 1610 1611 // Store the actual limb quotient. 1612 c->num[i] = (BcDig) result; 1613 } 1614 1615 err: 1616 BC_SIG_MAYLOCK; 1617 bc_num_free(&cpb); 1618 BC_LONGJMP_CONT; 1619 } 1620 1621 /** 1622 * Implements division. This is a BcNumBinOp function. 1623 * @param a The first operand. 1624 * @param b The second operand. 1625 * @param c The return parameter. 1626 * @param scale The current scale. 1627 */ 1628 static void bc_num_d(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1629 1630 size_t len, cpardx; 1631 BcNum cpa, cpb; 1632 1633 if (BC_NUM_ZERO(b)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO); 1634 1635 if (BC_NUM_ZERO(a)) { 1636 bc_num_setToZero(c, scale); 1637 return; 1638 } 1639 1640 if (BC_NUM_ONE(b)) { 1641 bc_num_copy(c, a); 1642 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b)); 1643 return; 1644 } 1645 1646 // If this is true, we can use bc_num_divArray(), which would be faster. 1647 if (!BC_NUM_RDX_VAL(a) && !BC_NUM_RDX_VAL(b) && b->len == 1 && !scale) { 1648 BcBigDig rem; 1649 bc_num_divArray(a, (BcBigDig) b->num[0], c, &rem); 1650 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b)); 1651 return; 1652 } 1653 1654 len = bc_num_divReq(a, b, scale); 1655 1656 BC_SIG_LOCK; 1657 1658 // Initialize copies of the parameters. We want the length of the first 1659 // operand copy to be as big as the result because of the way the division 1660 // is implemented. 1661 bc_num_init(&cpa, len); 1662 bc_num_copy(&cpa, a); 1663 bc_num_createCopy(&cpb, b); 1664 1665 BC_SETJMP_LOCKED(err); 1666 1667 BC_SIG_UNLOCK; 1668 1669 len = b->len; 1670 1671 // Like the above comment, we want the copy of the first parameter to be 1672 // larger than the second parameter. 1673 if (len > cpa.len) { 1674 bc_num_expand(&cpa, bc_vm_growSize(len, 2)); 1675 bc_num_extend(&cpa, (len - cpa.len) * BC_BASE_DIGS); 1676 } 1677 1678 cpardx = BC_NUM_RDX_VAL_NP(cpa); 1679 cpa.scale = cpardx * BC_BASE_DIGS; 1680 1681 // This is just setting up the scale in preparation for the division. 1682 bc_num_extend(&cpa, b->scale); 1683 cpardx = BC_NUM_RDX_VAL_NP(cpa) - BC_NUM_RDX(b->scale); 1684 BC_NUM_RDX_SET_NP(cpa, cpardx); 1685 cpa.scale = cpardx * BC_BASE_DIGS; 1686 1687 // Once again, just setting things up, this time to match scale. 1688 if (scale > cpa.scale) { 1689 bc_num_extend(&cpa, scale); 1690 cpardx = BC_NUM_RDX_VAL_NP(cpa); 1691 cpa.scale = cpardx * BC_BASE_DIGS; 1692 } 1693 1694 // Grow if necessary. 1695 if (cpa.cap == cpa.len) bc_num_expand(&cpa, bc_vm_growSize(cpa.len, 1)); 1696 1697 // We want an extra zero in front to make things simpler. 1698 cpa.num[cpa.len++] = 0; 1699 1700 // Still setting things up. Why all of these things are needed is not 1701 // something that can be easily explained, but it has to do with making the 1702 // actual algorithm easier to understand because it can assume a lot of 1703 // things. Thus, you should view all of this setup code as establishing 1704 // assumptions for bc_num_d_long(), where the actual division happens. 1705 if (cpardx == cpa.len) cpa.len = bc_num_nonZeroLen(&cpa); 1706 if (BC_NUM_RDX_VAL_NP(cpb) == cpb.len) cpb.len = bc_num_nonZeroLen(&cpb); 1707 cpb.scale = 0; 1708 BC_NUM_RDX_SET_NP(cpb, 0); 1709 1710 bc_num_d_long(&cpa, &cpb, c, scale); 1711 1712 bc_num_retireMul(c, scale, BC_NUM_NEG(a), BC_NUM_NEG(b)); 1713 1714 err: 1715 BC_SIG_MAYLOCK; 1716 bc_num_free(&cpb); 1717 bc_num_free(&cpa); 1718 BC_LONGJMP_CONT; 1719 } 1720 1721 /** 1722 * Implements divmod. This is the actual modulus function; since modulus 1723 * requires a division anyway, this returns the quotient and modulus. Either can 1724 * be thrown out as desired. 1725 * @param a The first operand. 1726 * @param b The second operand. 1727 * @param c The return parameter for the quotient. 1728 * @param d The return parameter for the modulus. 1729 * @param scale The current scale. 1730 * @param ts The scale that the operation should be done to. Yes, it's not 1731 * necessarily the same as scale, per the bc spec. 1732 */ 1733 static void bc_num_r(BcNum *a, BcNum *b, BcNum *restrict c, 1734 BcNum *restrict d, size_t scale, size_t ts) 1735 { 1736 BcNum temp; 1737 bool neg; 1738 1739 if (BC_NUM_ZERO(b)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO); 1740 1741 if (BC_NUM_ZERO(a)) { 1742 bc_num_setToZero(c, ts); 1743 bc_num_setToZero(d, ts); 1744 return; 1745 } 1746 1747 BC_SIG_LOCK; 1748 1749 bc_num_init(&temp, d->cap); 1750 1751 BC_SETJMP_LOCKED(err); 1752 1753 BC_SIG_UNLOCK; 1754 1755 // Division. 1756 bc_num_d(a, b, c, scale); 1757 1758 // We want an extra digit so we can safely truncate. 1759 if (scale) scale = ts + 1; 1760 1761 assert(BC_NUM_RDX_VALID(c)); 1762 assert(BC_NUM_RDX_VALID(b)); 1763 1764 // Implement the rest of the (a - (a / b) * b) formula. 1765 bc_num_m(c, b, &temp, scale); 1766 bc_num_sub(a, &temp, d, scale); 1767 1768 // Extend if necessary. 1769 if (ts > d->scale && BC_NUM_NONZERO(d)) bc_num_extend(d, ts - d->scale); 1770 1771 neg = BC_NUM_NEG(d); 1772 bc_num_retireMul(d, ts, BC_NUM_NEG(a), BC_NUM_NEG(b)); 1773 d->rdx = BC_NUM_NEG_VAL(d, BC_NUM_NONZERO(d) ? neg : false); 1774 1775 err: 1776 BC_SIG_MAYLOCK; 1777 bc_num_free(&temp); 1778 BC_LONGJMP_CONT; 1779 } 1780 1781 /** 1782 * Implements modulus/remainder. (Yes, I know they are different, but not in the 1783 * context of bc.) This is a BcNumBinOp function. 1784 * @param a The first operand. 1785 * @param b The second operand. 1786 * @param c The return parameter. 1787 * @param scale The current scale. 1788 */ 1789 static void bc_num_rem(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1790 1791 BcNum c1; 1792 size_t ts; 1793 1794 ts = bc_vm_growSize(scale, b->scale); 1795 ts = BC_MAX(ts, a->scale); 1796 1797 BC_SIG_LOCK; 1798 1799 // Need a temp for the quotient. 1800 bc_num_init(&c1, bc_num_mulReq(a, b, ts)); 1801 1802 BC_SETJMP_LOCKED(err); 1803 1804 BC_SIG_UNLOCK; 1805 1806 bc_num_r(a, b, &c1, c, scale, ts); 1807 1808 err: 1809 BC_SIG_MAYLOCK; 1810 bc_num_free(&c1); 1811 BC_LONGJMP_CONT; 1812 } 1813 1814 /** 1815 * Implements power (exponentiation). This is a BcNumBinOp function. 1816 * @param a The first operand. 1817 * @param b The second operand. 1818 * @param c The return parameter. 1819 * @param scale The current scale. 1820 */ 1821 static void bc_num_p(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1822 1823 BcNum copy, btemp; 1824 BcBigDig exp; 1825 size_t powrdx, resrdx; 1826 bool neg; 1827 1828 if (BC_ERR(bc_num_nonInt(b, &btemp))) bc_err(BC_ERR_MATH_NON_INTEGER); 1829 1830 if (BC_NUM_ZERO(&btemp)) { 1831 bc_num_one(c); 1832 return; 1833 } 1834 1835 if (BC_NUM_ZERO(a)) { 1836 if (BC_NUM_NEG_NP(btemp)) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO); 1837 bc_num_setToZero(c, scale); 1838 return; 1839 } 1840 1841 if (BC_NUM_ONE(&btemp)) { 1842 if (!BC_NUM_NEG_NP(btemp)) bc_num_copy(c, a); 1843 else bc_num_inv(a, c, scale); 1844 return; 1845 } 1846 1847 neg = BC_NUM_NEG_NP(btemp); 1848 BC_NUM_NEG_CLR_NP(btemp); 1849 1850 exp = bc_num_bigdig(&btemp); 1851 1852 BC_SIG_LOCK; 1853 1854 bc_num_createCopy(©, a); 1855 1856 BC_SETJMP_LOCKED(err); 1857 1858 BC_SIG_UNLOCK; 1859 1860 // If this is true, then we do not have to do a division, and we need to 1861 // set scale accordingly. 1862 if (!neg) { 1863 size_t max = BC_MAX(scale, a->scale), scalepow; 1864 scalepow = bc_num_mulOverflow(a->scale, exp); 1865 scale = BC_MIN(scalepow, max); 1866 } 1867 1868 // This is only implementing the first exponentiation by squaring, until it 1869 // reaches the first time where the square is actually used. 1870 for (powrdx = a->scale; !(exp & 1); exp >>= 1) { 1871 powrdx <<= 1; 1872 assert(BC_NUM_RDX_VALID_NP(copy)); 1873 bc_num_mul(©, ©, ©, powrdx); 1874 } 1875 1876 // Make c a copy of copy for the purpose of saving the squares that should 1877 // be saved. 1878 bc_num_copy(c, ©); 1879 resrdx = powrdx; 1880 1881 // Now finish the exponentiation by squaring, this time saving the squares 1882 // as necessary. 1883 while (exp >>= 1) { 1884 1885 powrdx <<= 1; 1886 assert(BC_NUM_RDX_VALID_NP(copy)); 1887 bc_num_mul(©, ©, ©, powrdx); 1888 1889 // If this is true, we want to save that particular square. This does 1890 // that by multiplying c with copy. 1891 if (exp & 1) { 1892 resrdx += powrdx; 1893 assert(BC_NUM_RDX_VALID(c)); 1894 assert(BC_NUM_RDX_VALID_NP(copy)); 1895 bc_num_mul(c, ©, c, resrdx); 1896 } 1897 } 1898 1899 // Invert if necessary. 1900 if (neg) bc_num_inv(c, c, scale); 1901 1902 // Truncate if necessary. 1903 if (c->scale > scale) bc_num_truncate(c, c->scale - scale); 1904 1905 bc_num_clean(c); 1906 1907 err: 1908 BC_SIG_MAYLOCK; 1909 bc_num_free(©); 1910 BC_LONGJMP_CONT; 1911 } 1912 1913 #if BC_ENABLE_EXTRA_MATH 1914 /** 1915 * Implements the places operator. This is a BcNumBinOp function. 1916 * @param a The first operand. 1917 * @param b The second operand. 1918 * @param c The return parameter. 1919 * @param scale The current scale. 1920 */ 1921 static void bc_num_place(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1922 1923 BcBigDig val; 1924 1925 BC_UNUSED(scale); 1926 1927 val = bc_num_intop(a, b, c); 1928 1929 // Just truncate or extend as appropriate. 1930 if (val < c->scale) bc_num_truncate(c, c->scale - val); 1931 else if (val > c->scale) bc_num_extend(c, val - c->scale); 1932 } 1933 1934 /** 1935 * Implements the left shift operator. This is a BcNumBinOp function. 1936 */ 1937 static void bc_num_left(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1938 1939 BcBigDig val; 1940 1941 BC_UNUSED(scale); 1942 1943 val = bc_num_intop(a, b, c); 1944 1945 bc_num_shiftLeft(c, (size_t) val); 1946 } 1947 1948 /** 1949 * Implements the right shift operator. This is a BcNumBinOp function. 1950 */ 1951 static void bc_num_right(BcNum *a, BcNum *b, BcNum *restrict c, size_t scale) { 1952 1953 BcBigDig val; 1954 1955 BC_UNUSED(scale); 1956 1957 val = bc_num_intop(a, b, c); 1958 1959 if (BC_NUM_ZERO(c)) return; 1960 1961 bc_num_shiftRight(c, (size_t) val); 1962 } 1963 #endif // BC_ENABLE_EXTRA_MATH 1964 1965 /** 1966 * Prepares for, and calls, a binary operator function. This is probably the 1967 * most important function in the entire file because it establishes assumptions 1968 * that make the rest of the code so easy. Those assumptions include: 1969 * 1970 * - a is not the same pointer as c. 1971 * - b is not the same pointer as c. 1972 * - there is enough room in c for the result. 1973 * 1974 * Without these, this whole function would basically have to be duplicated for 1975 * *all* binary operators. 1976 * 1977 * @param a The first operand. 1978 * @param b The second operand. 1979 * @param c The return parameter. 1980 * @param scale The current scale. 1981 * @param req The number of limbs needed to fit the result. 1982 */ 1983 static void bc_num_binary(BcNum *a, BcNum *b, BcNum *c, size_t scale, 1984 BcNumBinOp op, size_t req) 1985 { 1986 BcNum *ptr_a, *ptr_b, num2; 1987 bool init = false; 1988 1989 assert(a != NULL && b != NULL && c != NULL && op != NULL); 1990 1991 assert(BC_NUM_RDX_VALID(a)); 1992 assert(BC_NUM_RDX_VALID(b)); 1993 1994 BC_SIG_LOCK; 1995 1996 // Reallocate if c == a. 1997 if (c == a) { 1998 1999 ptr_a = &num2; 2000 2001 memcpy(ptr_a, c, sizeof(BcNum)); 2002 init = true; 2003 } 2004 else { 2005 ptr_a = a; 2006 } 2007 2008 // Also reallocate if c == b. 2009 if (c == b) { 2010 2011 ptr_b = &num2; 2012 2013 if (c != a) { 2014 memcpy(ptr_b, c, sizeof(BcNum)); 2015 init = true; 2016 } 2017 } 2018 else { 2019 ptr_b = b; 2020 } 2021 2022 // Actually reallocate. If we don't reallocate, we want to expand at the 2023 // very least. 2024 if (init) { 2025 2026 bc_num_init(c, req); 2027 2028 // Must prepare for cleanup. We want this here so that locals that got 2029 // set stay set since a longjmp() is not guaranteed to preserve locals. 2030 BC_SETJMP_LOCKED(err); 2031 BC_SIG_UNLOCK; 2032 } 2033 else { 2034 BC_SIG_UNLOCK; 2035 bc_num_expand(c, req); 2036 } 2037 2038 // It is okay for a and b to be the same. If a binary operator function does 2039 // need them to be different, the binary operator function is responsible 2040 // for that. 2041 2042 // Call the actual binary operator function. 2043 op(ptr_a, ptr_b, c, scale); 2044 2045 assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c)); 2046 assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len); 2047 assert(BC_NUM_RDX_VALID(c)); 2048 assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len); 2049 2050 err: 2051 // Cleanup only needed if we initialized c to a new number. 2052 if (init) { 2053 BC_SIG_MAYLOCK; 2054 bc_num_free(&num2); 2055 BC_LONGJMP_CONT; 2056 } 2057 } 2058 2059 #if !defined(NDEBUG) || BC_ENABLE_LIBRARY 2060 2061 /** 2062 * Tests a number string for validity. This function has a history; I originally 2063 * wrote it because I did not trust my parser. Over time, however, I came to 2064 * trust it, so I was able to relegate this function to debug builds only, and I 2065 * used it in assert()'s. But then I created the library, and well, I can't 2066 * trust users, so I reused this for yelling at users. 2067 * @param val The string to check to see if it's a valid number string. 2068 * @return True if the string is a valid number string, false otherwise. 2069 */ 2070 bool bc_num_strValid(const char *restrict val) { 2071 2072 bool radix = false; 2073 size_t i, len = strlen(val); 2074 2075 // Notice that I don't check if there is a negative sign. That is not part 2076 // of a valid number, except in the library. The library-specific code takes 2077 // care of that part. 2078 2079 // Nothing in the string is okay. 2080 if (!len) return true; 2081 2082 // Loop through the characters. 2083 for (i = 0; i < len; ++i) { 2084 2085 BcDig c = val[i]; 2086 2087 // If we have found a radix point... 2088 if (c == '.') { 2089 2090 // We don't allow two radices. 2091 if (radix) return false; 2092 2093 radix = true; 2094 continue; 2095 } 2096 2097 // We only allow digits and uppercase letters. 2098 if (!(isdigit(c) || isupper(c))) return false; 2099 } 2100 2101 return true; 2102 } 2103 #endif // !defined(NDEBUG) || BC_ENABLE_LIBRARY 2104 2105 /** 2106 * Parses one character and returns the digit that corresponds to that 2107 * character according to the base. 2108 * @param c The character to parse. 2109 * @param base The base. 2110 * @return The character as a digit. 2111 */ 2112 static BcBigDig bc_num_parseChar(char c, size_t base) { 2113 2114 assert(isupper(c) || isdigit(c)); 2115 2116 // If a letter... 2117 if (isupper(c)) { 2118 2119 // This returns the digit that directly corresponds with the letter. 2120 c = BC_NUM_NUM_LETTER(c); 2121 2122 // If the digit is greater than the base, we clamp. 2123 c = ((size_t) c) >= base ? (char) base - 1 : c; 2124 } 2125 // Straight convert the digit to a number. 2126 else c -= '0'; 2127 2128 return (BcBigDig) (uchar) c; 2129 } 2130 2131 /** 2132 * Parses a string as a decimal number. This is separate because it's going to 2133 * be the most used, and it can be heavily optimized for decimal only. 2134 * @param n The number to parse into and return. Must be preallocated. 2135 * @param val The string to parse. 2136 */ 2137 static void bc_num_parseDecimal(BcNum *restrict n, const char *restrict val) { 2138 2139 size_t len, i, temp, mod; 2140 const char *ptr; 2141 bool zero = true, rdx; 2142 2143 // Eat leading zeroes. 2144 for (i = 0; val[i] == '0'; ++i); 2145 2146 val += i; 2147 assert(!val[0] || isalnum(val[0]) || val[0] == '.'); 2148 2149 // All 0's. We can just return, since this procedure expects a virgin 2150 // (already 0) BcNum. 2151 if (!val[0]) return; 2152 2153 // The length of the string is the length of the number, except it might be 2154 // one bigger because of a decimal point. 2155 len = strlen(val); 2156 2157 // Find the location of the decimal point. 2158 ptr = strchr(val, '.'); 2159 rdx = (ptr != NULL); 2160 2161 // We eat leading zeroes again. These leading zeroes are different because 2162 // they will come after the decimal point if they exist, and since that's 2163 // the case, they must be preserved. 2164 for (i = 0; i < len && (zero = (val[i] == '0' || val[i] == '.')); ++i); 2165 2166 // Set the scale of the number based on the location of the decimal point. 2167 // The casts to uintptr_t is to ensure that bc does not hit undefined 2168 // behavior when doing math on the values. 2169 n->scale = (size_t) (rdx * (((uintptr_t) (val + len)) - 2170 (((uintptr_t) ptr) + 1))); 2171 2172 // Set rdx. 2173 BC_NUM_RDX_SET(n, BC_NUM_RDX(n->scale)); 2174 2175 // Calculate length. First, the length of the integer, then the number of 2176 // digits in the last limb, then the length. 2177 i = len - (ptr == val ? 0 : i) - rdx; 2178 temp = BC_NUM_ROUND_POW(i); 2179 mod = n->scale % BC_BASE_DIGS; 2180 i = mod ? BC_BASE_DIGS - mod : 0; 2181 n->len = ((temp + i) / BC_BASE_DIGS); 2182 2183 // Expand and zero. 2184 bc_num_expand(n, n->len); 2185 memset(n->num, 0, BC_NUM_SIZE(n->len)); 2186 2187 if (zero) { 2188 // I think I can set rdx directly to zero here because n should be a 2189 // new number with sign set to false. 2190 n->len = n->rdx = 0; 2191 } 2192 else { 2193 2194 // There is actually stuff to parse if we make it here. Yay... 2195 BcBigDig exp, pow; 2196 2197 assert(i <= BC_NUM_BIGDIG_MAX); 2198 2199 // The exponent and power. 2200 exp = (BcBigDig) i; 2201 pow = bc_num_pow10[exp]; 2202 2203 // Parse loop. We parse backwards because numbers are stored little 2204 // endian. 2205 for (i = len - 1; i < len; --i, ++exp) { 2206 2207 char c = val[i]; 2208 2209 // Skip the decimal point. 2210 if (c == '.') exp -= 1; 2211 else { 2212 2213 // The index of the limb. 2214 size_t idx = exp / BC_BASE_DIGS; 2215 2216 // Clamp for the base. 2217 if (isupper(c)) c = '9'; 2218 2219 // Add the digit to the limb. 2220 n->num[idx] += (((BcBigDig) c) - '0') * pow; 2221 2222 // Adjust the power and exponent. 2223 if ((exp + 1) % BC_BASE_DIGS == 0) pow = 1; 2224 else pow *= BC_BASE; 2225 } 2226 } 2227 } 2228 } 2229 2230 /** 2231 * Parse a number in any base (besides decimal). 2232 * @param n The number to parse into and return. Must be preallocated. 2233 * @param val The string to parse. 2234 * @param base The base to parse as. 2235 */ 2236 static void bc_num_parseBase(BcNum *restrict n, const char *restrict val, 2237 BcBigDig base) 2238 { 2239 BcNum temp, mult1, mult2, result1, result2, *m1, *m2, *ptr; 2240 char c = 0; 2241 bool zero = true; 2242 BcBigDig v; 2243 size_t i, digs, len = strlen(val); 2244 2245 // If zero, just return because the number should be virgin (already 0). 2246 for (i = 0; zero && i < len; ++i) zero = (val[i] == '.' || val[i] == '0'); 2247 if (zero) return; 2248 2249 BC_SIG_LOCK; 2250 2251 bc_num_init(&temp, BC_NUM_BIGDIG_LOG10); 2252 bc_num_init(&mult1, BC_NUM_BIGDIG_LOG10); 2253 2254 BC_SETJMP_LOCKED(int_err); 2255 2256 BC_SIG_UNLOCK; 2257 2258 // We split parsing into parsing the integer and parsing the fractional 2259 // part. 2260 2261 // Parse the integer part. This is the easy part because we just multiply 2262 // the number by the base, then add the digit. 2263 for (i = 0; i < len && (c = val[i]) && c != '.'; ++i) { 2264 2265 // Convert the character to a digit. 2266 v = bc_num_parseChar(c, base); 2267 2268 // Multiply the number. 2269 bc_num_mulArray(n, base, &mult1); 2270 2271 // Convert the digit to a number and add. 2272 bc_num_bigdig2num(&temp, v); 2273 bc_num_add(&mult1, &temp, n, 0); 2274 } 2275 2276 // If this condition is true, then we are done. We still need to do cleanup 2277 // though. 2278 if (i == len && !val[i]) goto int_err; 2279 2280 // If we get here, we *must* be at the radix point. 2281 assert(val[i] == '.'); 2282 2283 BC_SIG_LOCK; 2284 2285 // Unset the jump to reset in for these new initializations. 2286 BC_UNSETJMP; 2287 2288 bc_num_init(&mult2, BC_NUM_BIGDIG_LOG10); 2289 bc_num_init(&result1, BC_NUM_DEF_SIZE); 2290 bc_num_init(&result2, BC_NUM_DEF_SIZE); 2291 bc_num_one(&mult1); 2292 2293 BC_SETJMP_LOCKED(err); 2294 2295 BC_SIG_UNLOCK; 2296 2297 // Pointers for easy switching. 2298 m1 = &mult1; 2299 m2 = &mult2; 2300 2301 // Parse the fractional part. This is the hard part. 2302 for (i += 1, digs = 0; i < len && (c = val[i]); ++i, ++digs) { 2303 2304 size_t rdx; 2305 2306 // Convert the character to a digit. 2307 v = bc_num_parseChar(c, base); 2308 2309 // We keep growing result2 according to the base because the more digits 2310 // after the radix, the more significant the digits close to the radix 2311 // should be. 2312 bc_num_mulArray(&result1, base, &result2); 2313 2314 // Convert the digit to a number. 2315 bc_num_bigdig2num(&temp, v); 2316 2317 // Add the digit into the fraction part. 2318 bc_num_add(&result2, &temp, &result1, 0); 2319 2320 // Keep growing m1 and m2 for use after the loop. 2321 bc_num_mulArray(m1, base, m2); 2322 2323 rdx = BC_NUM_RDX_VAL(m2); 2324 2325 if (m2->len < rdx) m2->len = rdx; 2326 2327 // Switch. 2328 ptr = m1; 2329 m1 = m2; 2330 m2 = ptr; 2331 } 2332 2333 // This one cannot be a divide by 0 because mult starts out at 1, then is 2334 // multiplied by base, and base cannot be 0, so mult cannot be 0. And this 2335 // is the reason we keep growing m1 and m2; this division is what converts 2336 // the parsed fractional part from an integer to a fractional part. 2337 bc_num_div(&result1, m1, &result2, digs * 2); 2338 2339 // Pretruncate. 2340 bc_num_truncate(&result2, digs); 2341 2342 // The final add of the integer part to the fractional part. 2343 bc_num_add(n, &result2, n, digs); 2344 2345 // Basic cleanup. 2346 if (BC_NUM_NONZERO(n)) { 2347 if (n->scale < digs) bc_num_extend(n, digs - n->scale); 2348 } 2349 else bc_num_zero(n); 2350 2351 err: 2352 BC_SIG_MAYLOCK; 2353 bc_num_free(&result2); 2354 bc_num_free(&result1); 2355 bc_num_free(&mult2); 2356 int_err: 2357 BC_SIG_MAYLOCK; 2358 bc_num_free(&mult1); 2359 bc_num_free(&temp); 2360 BC_LONGJMP_CONT; 2361 } 2362 2363 /** 2364 * Prints a backslash+newline combo if the number of characters needs it. This 2365 * is really a convenience function. 2366 */ 2367 static inline void bc_num_printNewline(void) { 2368 #if !BC_ENABLE_LIBRARY 2369 if (vm.nchars >= vm.line_len - 1 && vm.line_len) { 2370 bc_vm_putchar('\\', bc_flush_none); 2371 bc_vm_putchar('\n', bc_flush_err); 2372 } 2373 #endif // !BC_ENABLE_LIBRARY 2374 } 2375 2376 /** 2377 * Prints a character after a backslash+newline, if needed. 2378 * @param c The character to print. 2379 * @param bslash Whether to print a backslash+newline. 2380 */ 2381 static void bc_num_putchar(int c, bool bslash) { 2382 if (c != '\n' && bslash) bc_num_printNewline(); 2383 bc_vm_putchar(c, bc_flush_save); 2384 } 2385 2386 #if !BC_ENABLE_LIBRARY 2387 2388 /** 2389 * Prints a character for a number's digit. This is for printing for dc's P 2390 * command. This function does not need to worry about radix points. This is a 2391 * BcNumDigitOp. 2392 * @param n The "digit" to print. 2393 * @param len The "length" of the digit, or number of characters that will 2394 * need to be printed for the digit. 2395 * @param rdx True if a decimal (radix) point should be printed. 2396 * @param bslash True if a backslash+newline should be printed if the character 2397 * limit for the line is reached, false otherwise. 2398 */ 2399 static void bc_num_printChar(size_t n, size_t len, bool rdx, bool bslash) { 2400 BC_UNUSED(rdx); 2401 BC_UNUSED(len); 2402 BC_UNUSED(bslash); 2403 assert(len == 1); 2404 bc_vm_putchar((uchar) n, bc_flush_save); 2405 } 2406 2407 #endif // !BC_ENABLE_LIBRARY 2408 2409 /** 2410 * Prints a series of characters for large bases. This is for printing in bases 2411 * above hexadecimal. This is a BcNumDigitOp. 2412 * @param n The "digit" to print. 2413 * @param len The "length" of the digit, or number of characters that will 2414 * need to be printed for the digit. 2415 * @param rdx True if a decimal (radix) point should be printed. 2416 * @param bslash True if a backslash+newline should be printed if the character 2417 * limit for the line is reached, false otherwise. 2418 */ 2419 static void bc_num_printDigits(size_t n, size_t len, bool rdx, bool bslash) { 2420 2421 size_t exp, pow; 2422 2423 // If needed, print the radix; otherwise, print a space to separate digits. 2424 bc_num_putchar(rdx ? '.' : ' ', true); 2425 2426 // Calculate the exponent and power. 2427 for (exp = 0, pow = 1; exp < len - 1; ++exp, pow *= BC_BASE); 2428 2429 // Print each character individually. 2430 for (exp = 0; exp < len; pow /= BC_BASE, ++exp) { 2431 2432 // The individual subdigit. 2433 size_t dig = n / pow; 2434 2435 // Take the subdigit away. 2436 n -= dig * pow; 2437 2438 // Print the subdigit. 2439 bc_num_putchar(((uchar) dig) + '0', bslash || exp != len - 1); 2440 } 2441 } 2442 2443 /** 2444 * Prints a character for a number's digit. This is for printing in bases for 2445 * hexadecimal and below because they always print only one character at a time. 2446 * This is a BcNumDigitOp. 2447 * @param n The "digit" to print. 2448 * @param len The "length" of the digit, or number of characters that will 2449 * need to be printed for the digit. 2450 * @param rdx True if a decimal (radix) point should be printed. 2451 * @param bslash True if a backslash+newline should be printed if the character 2452 * limit for the line is reached, false otherwise. 2453 */ 2454 static void bc_num_printHex(size_t n, size_t len, bool rdx, bool bslash) { 2455 2456 BC_UNUSED(len); 2457 BC_UNUSED(bslash); 2458 2459 assert(len == 1); 2460 2461 if (rdx) bc_num_putchar('.', true); 2462 2463 bc_num_putchar(bc_num_hex_digits[n], bslash); 2464 } 2465 2466 /** 2467 * Prints a decimal number. This is specially written for optimization since 2468 * this will be used the most and because bc's numbers are already in decimal. 2469 * @param n The number to print. 2470 * @param newline Whether to print backslash+newlines on long enough lines. 2471 */ 2472 static void bc_num_printDecimal(const BcNum *restrict n, bool newline) { 2473 2474 size_t i, j, rdx = BC_NUM_RDX_VAL(n); 2475 bool zero = true; 2476 size_t buffer[BC_BASE_DIGS]; 2477 2478 // Print loop. 2479 for (i = n->len - 1; i < n->len; --i) { 2480 2481 BcDig n9 = n->num[i]; 2482 size_t temp; 2483 bool irdx = (i == rdx - 1); 2484 2485 // Calculate the number of digits in the limb. 2486 zero = (zero & !irdx); 2487 temp = n->scale % BC_BASE_DIGS; 2488 temp = i || !temp ? 0 : BC_BASE_DIGS - temp; 2489 2490 memset(buffer, 0, BC_BASE_DIGS * sizeof(size_t)); 2491 2492 // Fill the buffer with individual digits. 2493 for (j = 0; n9 && j < BC_BASE_DIGS; ++j) { 2494 buffer[j] = ((size_t) n9) % BC_BASE; 2495 n9 /= BC_BASE; 2496 } 2497 2498 // Print the digits in the buffer. 2499 for (j = BC_BASE_DIGS - 1; j < BC_BASE_DIGS && j >= temp; --j) { 2500 2501 // Figure out whether to print the decimal point. 2502 bool print_rdx = (irdx & (j == BC_BASE_DIGS - 1)); 2503 2504 // The zero variable helps us skip leading zero digits in the limb. 2505 zero = (zero && buffer[j] == 0); 2506 2507 if (!zero) { 2508 2509 // While the first three arguments should be self-explanatory, 2510 // the last needs explaining. I don't want to print a newline 2511 // when the last digit to be printed could take the place of the 2512 // backslash rather than being pushed, as a single character, to 2513 // the next line. That's what that last argument does for bc. 2514 bc_num_printHex(buffer[j], 1, print_rdx, 2515 !newline || (j > temp || i != 0)); 2516 } 2517 } 2518 } 2519 } 2520 2521 #if BC_ENABLE_EXTRA_MATH 2522 2523 /** 2524 * Prints a number in scientific or engineering format. When doing this, we are 2525 * always printing in decimal. 2526 * @param n The number to print. 2527 * @param eng True if we are in engineering mode. 2528 * @param newline Whether to print backslash+newlines on long enough lines. 2529 */ 2530 static void bc_num_printExponent(const BcNum *restrict n, 2531 bool eng, bool newline) 2532 { 2533 size_t places, mod, nrdx = BC_NUM_RDX_VAL(n); 2534 bool neg = (n->len <= nrdx); 2535 BcNum temp, exp; 2536 BcDig digs[BC_NUM_BIGDIG_LOG10]; 2537 2538 BC_SIG_LOCK; 2539 2540 bc_num_createCopy(&temp, n); 2541 2542 BC_SETJMP_LOCKED(exit); 2543 2544 BC_SIG_UNLOCK; 2545 2546 // We need to calculate the exponents, and they change based on whether the 2547 // number is all fractional or not, obviously. 2548 if (neg) { 2549 2550 // Figure out how many limbs after the decimal point is zero. 2551 size_t i, idx = bc_num_nonZeroLen(n) - 1; 2552 2553 places = 1; 2554 2555 // Figure out how much in the last limb is zero. 2556 for (i = BC_BASE_DIGS - 1; i < BC_BASE_DIGS; --i) { 2557 if (bc_num_pow10[i] > (BcBigDig) n->num[idx]) places += 1; 2558 else break; 2559 } 2560 2561 // Calculate the combination of zero limbs and zero digits in the last 2562 // limb. 2563 places += (nrdx - (idx + 1)) * BC_BASE_DIGS; 2564 mod = places % 3; 2565 2566 // Calculate places if we are in engineering mode. 2567 if (eng && mod != 0) places += 3 - mod; 2568 2569 // Shift the temp to the right place. 2570 bc_num_shiftLeft(&temp, places); 2571 } 2572 else { 2573 2574 // This is the number of digits that we are supposed to put behind the 2575 // decimal point. 2576 places = bc_num_intDigits(n) - 1; 2577 2578 // Calculate the true number based on whether engineering mode is 2579 // activated. 2580 mod = places % 3; 2581 if (eng && mod != 0) places -= 3 - (3 - mod); 2582 2583 // Shift the temp to the right place. 2584 bc_num_shiftRight(&temp, places); 2585 } 2586 2587 // Print the shifted number. 2588 bc_num_printDecimal(&temp, newline); 2589 2590 // Print the e. 2591 bc_num_putchar('e', !newline); 2592 2593 // Need to explicitly print a zero exponent. 2594 if (!places) { 2595 bc_num_printHex(0, 1, false, !newline); 2596 goto exit; 2597 } 2598 2599 // Need to print sign for the exponent. 2600 if (neg) bc_num_putchar('-', true); 2601 2602 // Create a temporary for the exponent... 2603 bc_num_setup(&exp, digs, BC_NUM_BIGDIG_LOG10); 2604 bc_num_bigdig2num(&exp, (BcBigDig) places); 2605 2606 /// ..and print it. 2607 bc_num_printDecimal(&exp, newline); 2608 2609 exit: 2610 BC_SIG_MAYLOCK; 2611 bc_num_free(&temp); 2612 BC_LONGJMP_CONT; 2613 } 2614 #endif // BC_ENABLE_EXTRA_MATH 2615 2616 /** 2617 * Converts a number from limbs with base BC_BASE_POW to base @a pow, where 2618 * @a pow is obase^N. 2619 * @param n The number to convert. 2620 * @param rem BC_BASE_POW - @a pow. 2621 * @param pow The power of obase we will convert the number to. 2622 * @param idx The index of the number to start converting at. Doing the 2623 * conversion is O(n^2); we have to sweep through starting at the 2624 * least significant limb 2625 */ 2626 static void bc_num_printFixup(BcNum *restrict n, BcBigDig rem, 2627 BcBigDig pow, size_t idx) 2628 { 2629 size_t i, len = n->len - idx; 2630 BcBigDig acc; 2631 BcDig *a = n->num + idx; 2632 2633 // Ignore if there's just one limb left. This is the part that requires the 2634 // extra loop after the one calling this function in bc_num_printPrepare(). 2635 if (len < 2) return; 2636 2637 // Loop through the remaining limbs and convert. We start at the second limb 2638 // because we pull the value from the previous one as well. 2639 for (i = len - 1; i > 0; --i) { 2640 2641 // Get the limb and add it to the previous, along with multiplying by 2642 // the remainder because that's the proper overflow. "acc" means 2643 // "accumulator," by the way. 2644 acc = ((BcBigDig) a[i]) * rem + ((BcBigDig) a[i - 1]); 2645 2646 // Store a value in base pow in the previous limb. 2647 a[i - 1] = (BcDig) (acc % pow); 2648 2649 // Divide by the base and accumulate the remaining value in the limb. 2650 acc /= pow; 2651 acc += (BcBigDig) a[i]; 2652 2653 // If the accumulator is greater than the base... 2654 if (acc >= BC_BASE_POW) { 2655 2656 // Do we need to grow? 2657 if (i == len - 1) { 2658 2659 // Grow. 2660 len = bc_vm_growSize(len, 1); 2661 bc_num_expand(n, bc_vm_growSize(len, idx)); 2662 2663 // Update the pointer because it may have moved. 2664 a = n->num + idx; 2665 2666 // Zero out the last limb. 2667 a[len - 1] = 0; 2668 } 2669 2670 // Overflow into the next limb since we are over the base. 2671 a[i + 1] += acc / BC_BASE_POW; 2672 acc %= BC_BASE_POW; 2673 } 2674 2675 assert(acc < BC_BASE_POW); 2676 2677 // Set the limb. 2678 a[i] = (BcDig) acc; 2679 } 2680 2681 // We may have grown the number, so adjust the length. 2682 n->len = len + idx; 2683 } 2684 2685 /** 2686 * Prepares a number for printing in a base that is not a divisor of 2687 * BC_BASE_POW. This basically converts the number from having limbs of base 2688 * BC_BASE_POW to limbs of pow, where pow is obase^N. 2689 * @param n The number to prepare for printing. 2690 * @param rem The remainder of BC_BASE_POW when divided by a power of the base. 2691 * @param pow The power of the base. 2692 */ 2693 static void bc_num_printPrepare(BcNum *restrict n, BcBigDig rem, BcBigDig pow) { 2694 2695 size_t i; 2696 2697 // Loop from the least significant limb to the most significant limb and 2698 // convert limbs in each pass. 2699 for (i = 0; i < n->len; ++i) bc_num_printFixup(n, rem, pow, i); 2700 2701 // bc_num_printFixup() does not do everything it is supposed to, so we do 2702 // the last bit of cleanup here. That cleanup is to ensure that each limb 2703 // is less than pow and to expand the number to fit new limbs as necessary. 2704 for (i = 0; i < n->len; ++i) { 2705 2706 assert(pow == ((BcBigDig) ((BcDig) pow))); 2707 2708 // If the limb needs fixing... 2709 if (n->num[i] >= (BcDig) pow) { 2710 2711 // Do we need to grow? 2712 if (i + 1 == n->len) { 2713 2714 // Grow the number. 2715 n->len = bc_vm_growSize(n->len, 1); 2716 bc_num_expand(n, n->len); 2717 2718 // Without this, we might use uninitialized data. 2719 n->num[i + 1] = 0; 2720 } 2721 2722 assert(pow < BC_BASE_POW); 2723 2724 // Overflow into the next limb. 2725 n->num[i + 1] += n->num[i] / ((BcDig) pow); 2726 n->num[i] %= (BcDig) pow; 2727 } 2728 } 2729 } 2730 2731 static void bc_num_printNum(BcNum *restrict n, BcBigDig base, size_t len, 2732 BcNumDigitOp print, bool newline) 2733 { 2734 BcVec stack; 2735 BcNum intp, fracp1, fracp2, digit, flen1, flen2, *n1, *n2, *temp; 2736 BcBigDig dig = 0, *ptr, acc, exp; 2737 size_t i, j, nrdx, idigits; 2738 bool radix; 2739 BcDig digit_digs[BC_NUM_BIGDIG_LOG10 + 1]; 2740 2741 assert(base > 1); 2742 2743 // Easy case. Even with scale, we just print this. 2744 if (BC_NUM_ZERO(n)) { 2745 print(0, len, false, !newline); 2746 return; 2747 } 2748 2749 // This function uses an algorithm that Stefan Esser <se@freebsd.org> came 2750 // up with to print the integer part of a number. What it does is convert 2751 // intp into a number of the specified base, but it does it directly, 2752 // instead of just doing a series of divisions and printing the remainders 2753 // in reverse order. 2754 // 2755 // Let me explain in a bit more detail: 2756 // 2757 // The algorithm takes the current least significant limb (after intp has 2758 // been converted to an integer) and the next to least significant limb, and 2759 // it converts the least significant limb into one of the specified base, 2760 // putting any overflow into the next to least significant limb. It iterates 2761 // through the whole number, from least significant to most significant, 2762 // doing this conversion. At the end of that iteration, the least 2763 // significant limb is converted, but the others are not, so it iterates 2764 // again, starting at the next to least significant limb. It keeps doing 2765 // that conversion, skipping one more limb than the last time, until all 2766 // limbs have been converted. Then it prints them in reverse order. 2767 // 2768 // That is the gist of the algorithm. It leaves out several things, such as 2769 // the fact that limbs are not always converted into the specified base, but 2770 // into something close, basically a power of the specified base. In 2771 // Stefan's words, "You could consider BcDigs to be of base 10^BC_BASE_DIGS 2772 // in the normal case and obase^N for the largest value of N that satisfies 2773 // obase^N <= 10^BC_BASE_DIGS. [This means that] the result is not in base 2774 // "obase", but in base "obase^N", which happens to be printable as a number 2775 // of base "obase" without consideration for neighbouring BcDigs." This fact 2776 // is what necessitates the existence of the loop later in this function. 2777 // 2778 // The conversion happens in bc_num_printPrepare() where the outer loop 2779 // happens and bc_num_printFixup() where the inner loop, or actual 2780 // conversion, happens. In other words, bc_num_printPrepare() is where the 2781 // loop that starts at the least significant limb and goes to the most 2782 // significant limb. Then, on every iteration of its loop, it calls 2783 // bc_num_printFixup(), which has the inner loop of actually converting 2784 // the limbs it passes into limbs of base obase^N rather than base 2785 // BC_BASE_POW. 2786 2787 nrdx = BC_NUM_RDX_VAL(n); 2788 2789 BC_SIG_LOCK; 2790 2791 // The stack is what allows us to reverse the digits for printing. 2792 bc_vec_init(&stack, sizeof(BcBigDig), BC_DTOR_NONE); 2793 bc_num_init(&fracp1, nrdx); 2794 2795 // intp will be the "integer part" of the number, so copy it. 2796 bc_num_createCopy(&intp, n); 2797 2798 BC_SETJMP_LOCKED(err); 2799 2800 BC_SIG_UNLOCK; 2801 2802 // Make intp an integer. 2803 bc_num_truncate(&intp, intp.scale); 2804 2805 // Get the fractional part out. 2806 bc_num_sub(n, &intp, &fracp1, 0); 2807 2808 // If the base is not the same as the last base used for printing, we need 2809 // to update the cached exponent and power. Yes, we cache the values of the 2810 // exponent and power. That is to prevent us from calculating them every 2811 // time because printing will probably happen multiple times on the same 2812 // base. 2813 if (base != vm.last_base) { 2814 2815 vm.last_pow = 1; 2816 vm.last_exp = 0; 2817 2818 // Calculate the exponent and power. 2819 while (vm.last_pow * base <= BC_BASE_POW) { 2820 vm.last_pow *= base; 2821 vm.last_exp += 1; 2822 } 2823 2824 // Also, the remainder and base itself. 2825 vm.last_rem = BC_BASE_POW - vm.last_pow; 2826 vm.last_base = base; 2827 } 2828 2829 exp = vm.last_exp; 2830 2831 // If vm.last_rem is 0, then the base we are printing in is a divisor of 2832 // BC_BASE_POW, which is the easy case because it means that BC_BASE_POW is 2833 // a power of obase, and no conversion is needed. If it *is* 0, then we have 2834 // the hard case, and we have to prepare the number for the base. 2835 if (vm.last_rem != 0) bc_num_printPrepare(&intp, vm.last_rem, vm.last_pow); 2836 2837 // After the conversion comes the surprisingly easy part. From here on out, 2838 // this is basically naive code that I wrote, adjusted for the larger bases. 2839 2840 // Fill the stack of digits for the integer part. 2841 for (i = 0; i < intp.len; ++i) { 2842 2843 // Get the limb. 2844 acc = (BcBigDig) intp.num[i]; 2845 2846 // Turn the limb into digits of base obase. 2847 for (j = 0; j < exp && (i < intp.len - 1 || acc != 0); ++j) 2848 { 2849 // This condition is true if we are not at the last digit. 2850 if (j != exp - 1) { 2851 dig = acc % base; 2852 acc /= base; 2853 } 2854 else { 2855 dig = acc; 2856 acc = 0; 2857 } 2858 2859 assert(dig < base); 2860 2861 // Push the digit onto the stack. 2862 bc_vec_push(&stack, &dig); 2863 } 2864 2865 assert(acc == 0); 2866 } 2867 2868 // Go through the stack backwards and print each digit. 2869 for (i = 0; i < stack.len; ++i) { 2870 2871 ptr = bc_vec_item_rev(&stack, i); 2872 2873 assert(ptr != NULL); 2874 2875 // While the first three arguments should be self-explanatory, the last 2876 // needs explaining. I don't want to print a newline when the last digit 2877 // to be printed could take the place of the backslash rather than being 2878 // pushed, as a single character, to the next line. That's what that 2879 // last argument does for bc. 2880 print(*ptr, len, false, !newline || 2881 (n->scale != 0 || i == stack.len - 1)); 2882 } 2883 2884 // We are done if there is no fractional part. 2885 if (!n->scale) goto err; 2886 2887 BC_SIG_LOCK; 2888 2889 // Reset the jump because some locals are changing. 2890 BC_UNSETJMP; 2891 2892 bc_num_init(&fracp2, nrdx); 2893 bc_num_setup(&digit, digit_digs, sizeof(digit_digs) / sizeof(BcDig)); 2894 bc_num_init(&flen1, BC_NUM_BIGDIG_LOG10); 2895 bc_num_init(&flen2, BC_NUM_BIGDIG_LOG10); 2896 2897 BC_SETJMP_LOCKED(frac_err); 2898 2899 BC_SIG_UNLOCK; 2900 2901 bc_num_one(&flen1); 2902 2903 radix = true; 2904 2905 // Pointers for easy switching. 2906 n1 = &flen1; 2907 n2 = &flen2; 2908 2909 fracp2.scale = n->scale; 2910 BC_NUM_RDX_SET_NP(fracp2, BC_NUM_RDX(fracp2.scale)); 2911 2912 // As long as we have not reached the scale of the number, keep printing. 2913 while ((idigits = bc_num_intDigits(n1)) <= n->scale) { 2914 2915 // These numbers will keep growing. 2916 bc_num_expand(&fracp2, fracp1.len + 1); 2917 bc_num_mulArray(&fracp1, base, &fracp2); 2918 2919 nrdx = BC_NUM_RDX_VAL_NP(fracp2); 2920 2921 // Ensure an invariant. 2922 if (fracp2.len < nrdx) fracp2.len = nrdx; 2923 2924 // fracp is guaranteed to be non-negative and small enough. 2925 dig = bc_num_bigdig2(&fracp2); 2926 2927 // Convert the digit to a number and subtract it from the number. 2928 bc_num_bigdig2num(&digit, dig); 2929 bc_num_sub(&fracp2, &digit, &fracp1, 0); 2930 2931 // While the first three arguments should be self-explanatory, the last 2932 // needs explaining. I don't want to print a newline when the last digit 2933 // to be printed could take the place of the backslash rather than being 2934 // pushed, as a single character, to the next line. That's what that 2935 // last argument does for bc. 2936 print(dig, len, radix, !newline || idigits != n->scale); 2937 2938 // Update the multipliers. 2939 bc_num_mulArray(n1, base, n2); 2940 2941 radix = false; 2942 2943 // Switch. 2944 temp = n1; 2945 n1 = n2; 2946 n2 = temp; 2947 } 2948 2949 frac_err: 2950 BC_SIG_MAYLOCK; 2951 bc_num_free(&flen2); 2952 bc_num_free(&flen1); 2953 bc_num_free(&fracp2); 2954 err: 2955 BC_SIG_MAYLOCK; 2956 bc_num_free(&fracp1); 2957 bc_num_free(&intp); 2958 bc_vec_free(&stack); 2959 BC_LONGJMP_CONT; 2960 } 2961 2962 /** 2963 * Prints a number in the specified base, or rather, figures out which function 2964 * to call to print the number in the specified base and calls it. 2965 * @param n The number to print. 2966 * @param base The base to print in. 2967 * @param newline Whether to print backslash+newlines on long enough lines. 2968 */ 2969 static void bc_num_printBase(BcNum *restrict n, BcBigDig base, bool newline) { 2970 2971 size_t width; 2972 BcNumDigitOp print; 2973 bool neg = BC_NUM_NEG(n); 2974 2975 // Clear the sign because it makes the actual printing easier when we have 2976 // to do math. 2977 BC_NUM_NEG_CLR(n); 2978 2979 // Bases at hexadecimal and below are printed as one character, larger bases 2980 // are printed as a series of digits separated by spaces. 2981 if (base <= BC_NUM_MAX_POSIX_IBASE) { 2982 width = 1; 2983 print = bc_num_printHex; 2984 } 2985 else { 2986 assert(base <= BC_BASE_POW); 2987 width = bc_num_log10(base - 1); 2988 print = bc_num_printDigits; 2989 } 2990 2991 // Print. 2992 bc_num_printNum(n, base, width, print, newline); 2993 2994 // Reset the sign. 2995 n->rdx = BC_NUM_NEG_VAL(n, neg); 2996 } 2997 2998 #if !BC_ENABLE_LIBRARY 2999 3000 void bc_num_stream(BcNum *restrict n) { 3001 bc_num_printNum(n, BC_NUM_STREAM_BASE, 1, bc_num_printChar, false); 3002 } 3003 3004 #endif // !BC_ENABLE_LIBRARY 3005 3006 void bc_num_setup(BcNum *restrict n, BcDig *restrict num, size_t cap) { 3007 assert(n != NULL); 3008 n->num = num; 3009 n->cap = cap; 3010 bc_num_zero(n); 3011 } 3012 3013 void bc_num_init(BcNum *restrict n, size_t req) { 3014 3015 BcDig *num; 3016 3017 BC_SIG_ASSERT_LOCKED; 3018 3019 assert(n != NULL); 3020 3021 // BC_NUM_DEF_SIZE is set to be about the smallest allocation size that 3022 // malloc() returns in practice, so just use it. 3023 req = req >= BC_NUM_DEF_SIZE ? req : BC_NUM_DEF_SIZE; 3024 3025 // If we can't use a temp, allocate. 3026 if (req != BC_NUM_DEF_SIZE || (num = bc_vm_takeTemp()) == NULL) 3027 num = bc_vm_malloc(BC_NUM_SIZE(req)); 3028 3029 bc_num_setup(n, num, req); 3030 } 3031 3032 void bc_num_clear(BcNum *restrict n) { 3033 n->num = NULL; 3034 n->cap = 0; 3035 } 3036 3037 void bc_num_free(void *num) { 3038 3039 BcNum *n = (BcNum*) num; 3040 3041 BC_SIG_ASSERT_LOCKED; 3042 3043 assert(n != NULL); 3044 3045 if (n->cap == BC_NUM_DEF_SIZE) bc_vm_addTemp(n->num); 3046 else free(n->num); 3047 } 3048 3049 void bc_num_copy(BcNum *d, const BcNum *s) { 3050 3051 assert(d != NULL && s != NULL); 3052 3053 if (d == s) return; 3054 3055 bc_num_expand(d, s->len); 3056 d->len = s->len; 3057 3058 // I can just copy directly here because the sign *and* rdx will be 3059 // properly preserved. 3060 d->rdx = s->rdx; 3061 d->scale = s->scale; 3062 memcpy(d->num, s->num, BC_NUM_SIZE(d->len)); 3063 } 3064 3065 void bc_num_createCopy(BcNum *d, const BcNum *s) { 3066 BC_SIG_ASSERT_LOCKED; 3067 bc_num_init(d, s->len); 3068 bc_num_copy(d, s); 3069 } 3070 3071 void bc_num_createFromBigdig(BcNum *restrict n, BcBigDig val) { 3072 BC_SIG_ASSERT_LOCKED; 3073 bc_num_init(n, BC_NUM_BIGDIG_LOG10); 3074 bc_num_bigdig2num(n, val); 3075 } 3076 3077 size_t bc_num_scale(const BcNum *restrict n) { 3078 return n->scale; 3079 } 3080 3081 size_t bc_num_len(const BcNum *restrict n) { 3082 3083 size_t len = n->len; 3084 3085 // Always return at least 1. 3086 if (BC_NUM_ZERO(n)) return n->scale ? n->scale : 1; 3087 3088 // If this is true, there is no integer portion of the number. 3089 if (BC_NUM_RDX_VAL(n) == len) { 3090 3091 // We have to take into account the fact that some of the digits right 3092 // after the decimal could be zero. If that is the case, we need to 3093 // ignore them until we hit the first non-zero digit. 3094 3095 size_t zero, scale; 3096 3097 // The number of limbs with non-zero digits. 3098 len = bc_num_nonZeroLen(n); 3099 3100 // Get the number of digits in the last limb. 3101 scale = n->scale % BC_BASE_DIGS; 3102 scale = scale ? scale : BC_BASE_DIGS; 3103 3104 // Get the number of zero digits. 3105 zero = bc_num_zeroDigits(n->num + len - 1); 3106 3107 // Calculate the true length. 3108 len = len * BC_BASE_DIGS - zero - (BC_BASE_DIGS - scale); 3109 } 3110 // Otherwise, count the number of int digits and return that plus the scale. 3111 else len = bc_num_intDigits(n) + n->scale; 3112 3113 return len; 3114 } 3115 3116 void bc_num_parse(BcNum *restrict n, const char *restrict val, BcBigDig base) { 3117 3118 assert(n != NULL && val != NULL && base); 3119 assert(base >= BC_NUM_MIN_BASE && base <= vm.maxes[BC_PROG_GLOBALS_IBASE]); 3120 assert(bc_num_strValid(val)); 3121 3122 // A one character number is *always* parsed as though the base was the 3123 // maximum allowed ibase, per the bc spec. 3124 if (!val[1]) { 3125 BcBigDig dig = bc_num_parseChar(val[0], BC_NUM_MAX_LBASE); 3126 bc_num_bigdig2num(n, dig); 3127 } 3128 else if (base == BC_BASE) bc_num_parseDecimal(n, val); 3129 else bc_num_parseBase(n, val, base); 3130 3131 assert(BC_NUM_RDX_VALID(n)); 3132 } 3133 3134 void bc_num_print(BcNum *restrict n, BcBigDig base, bool newline) { 3135 3136 assert(n != NULL); 3137 assert(BC_ENABLE_EXTRA_MATH || base >= BC_NUM_MIN_BASE); 3138 3139 // We may need a newline, just to start. 3140 bc_num_printNewline(); 3141 3142 if (BC_NUM_NONZERO(n)) { 3143 3144 // Print the sign. 3145 if (BC_NUM_NEG(n)) bc_num_putchar('-', true); 3146 3147 // Print the leading zero if necessary. 3148 if (BC_Z && BC_NUM_RDX_VAL(n) == n->len) 3149 bc_num_printHex(0, 1, false, !newline); 3150 } 3151 3152 // Short-circuit 0. 3153 if (BC_NUM_ZERO(n)) bc_num_printHex(0, 1, false, !newline); 3154 else if (base == BC_BASE) bc_num_printDecimal(n, newline); 3155 #if BC_ENABLE_EXTRA_MATH 3156 else if (base == 0 || base == 1) 3157 bc_num_printExponent(n, base != 0, newline); 3158 #endif // BC_ENABLE_EXTRA_MATH 3159 else bc_num_printBase(n, base, newline); 3160 3161 if (newline) bc_num_putchar('\n', false); 3162 } 3163 3164 BcBigDig bc_num_bigdig2(const BcNum *restrict n) { 3165 3166 // This function returns no errors because it's guaranteed to succeed if 3167 // its preconditions are met. Those preconditions include both n needs to 3168 // be non-NULL, n being non-negative, and n being less than vm.max. If all 3169 // of that is true, then we can just convert without worrying about negative 3170 // errors or overflow. 3171 3172 BcBigDig r = 0; 3173 size_t nrdx = BC_NUM_RDX_VAL(n); 3174 3175 assert(n != NULL); 3176 assert(!BC_NUM_NEG(n)); 3177 assert(bc_num_cmp(n, &vm.max) < 0); 3178 assert(n->len - nrdx <= 3); 3179 3180 // There is a small speed win from unrolling the loop here, and since it 3181 // only adds 53 bytes, I decided that it was worth it. 3182 switch (n->len - nrdx) { 3183 3184 case 3: 3185 { 3186 r = (BcBigDig) n->num[nrdx + 2]; 3187 } 3188 // Fallthrough. 3189 BC_FALLTHROUGH 3190 3191 case 2: 3192 { 3193 r = r * BC_BASE_POW + (BcBigDig) n->num[nrdx + 1]; 3194 } 3195 // Fallthrough. 3196 BC_FALLTHROUGH 3197 3198 case 1: 3199 { 3200 r = r * BC_BASE_POW + (BcBigDig) n->num[nrdx]; 3201 } 3202 } 3203 3204 return r; 3205 } 3206 3207 BcBigDig bc_num_bigdig(const BcNum *restrict n) { 3208 3209 assert(n != NULL); 3210 3211 // This error checking is extremely important, and if you do not have a 3212 // guarantee that converting a number will always succeed in a particular 3213 // case, you *must* call this function to get these error checks. This 3214 // includes all instances of numbers inputted by the user or calculated by 3215 // the user. Otherwise, you can call the faster bc_num_bigdig2(). 3216 if (BC_ERR(BC_NUM_NEG(n))) bc_err(BC_ERR_MATH_NEGATIVE); 3217 if (BC_ERR(bc_num_cmp(n, &vm.max) >= 0)) bc_err(BC_ERR_MATH_OVERFLOW); 3218 3219 return bc_num_bigdig2(n); 3220 } 3221 3222 void bc_num_bigdig2num(BcNum *restrict n, BcBigDig val) { 3223 3224 BcDig *ptr; 3225 size_t i; 3226 3227 assert(n != NULL); 3228 3229 bc_num_zero(n); 3230 3231 // Already 0. 3232 if (!val) return; 3233 3234 // Expand first. This is the only way this function can fail, and it's a 3235 // fatal error. 3236 bc_num_expand(n, BC_NUM_BIGDIG_LOG10); 3237 3238 // The conversion is easy because numbers are laid out in little-endian 3239 // order. 3240 for (ptr = n->num, i = 0; val; ++i, val /= BC_BASE_POW) 3241 ptr[i] = val % BC_BASE_POW; 3242 3243 n->len = i; 3244 } 3245 3246 #if BC_ENABLE_EXTRA_MATH 3247 3248 void bc_num_rng(const BcNum *restrict n, BcRNG *rng) { 3249 3250 BcNum temp, temp2, intn, frac; 3251 BcRand state1, state2, inc1, inc2; 3252 size_t nrdx = BC_NUM_RDX_VAL(n); 3253 3254 // This function holds the secret of how I interpret a seed number for the 3255 // PRNG. Well, it's actually in the development manual 3256 // (manuals/development.md#pseudo-random-number-generator), so look there 3257 // before you try to understand this. 3258 3259 BC_SIG_LOCK; 3260 3261 bc_num_init(&temp, n->len); 3262 bc_num_init(&temp2, n->len); 3263 bc_num_init(&frac, nrdx); 3264 bc_num_init(&intn, bc_num_int(n)); 3265 3266 BC_SETJMP_LOCKED(err); 3267 3268 BC_SIG_UNLOCK; 3269 3270 assert(BC_NUM_RDX_VALID_NP(vm.max)); 3271 3272 memcpy(frac.num, n->num, BC_NUM_SIZE(nrdx)); 3273 frac.len = nrdx; 3274 BC_NUM_RDX_SET_NP(frac, nrdx); 3275 frac.scale = n->scale; 3276 3277 assert(BC_NUM_RDX_VALID_NP(frac)); 3278 assert(BC_NUM_RDX_VALID_NP(vm.max2)); 3279 3280 // Multiply the fraction and truncate so that it's an integer. The 3281 // truncation is what clamps it, by the way. 3282 bc_num_mul(&frac, &vm.max2, &temp, 0); 3283 bc_num_truncate(&temp, temp.scale); 3284 bc_num_copy(&frac, &temp); 3285 3286 // Get the integer. 3287 memcpy(intn.num, n->num + nrdx, BC_NUM_SIZE(bc_num_int(n))); 3288 intn.len = bc_num_int(n); 3289 3290 // This assert is here because it has to be true. It is also here to justify 3291 // some optimizations. 3292 assert(BC_NUM_NONZERO(&vm.max)); 3293 3294 // If there *was* a fractional part... 3295 if (BC_NUM_NONZERO(&frac)) { 3296 3297 // This divmod splits frac into the two state parts. 3298 bc_num_divmod(&frac, &vm.max, &temp, &temp2, 0); 3299 3300 // frac is guaranteed to be smaller than vm.max * vm.max (pow). 3301 // This means that when dividing frac by vm.max, as above, the 3302 // quotient and remainder are both guaranteed to be less than vm.max, 3303 // which means we can use bc_num_bigdig2() here and not worry about 3304 // overflow. 3305 state1 = (BcRand) bc_num_bigdig2(&temp2); 3306 state2 = (BcRand) bc_num_bigdig2(&temp); 3307 } 3308 else state1 = state2 = 0; 3309 3310 // If there *was* an integer part... 3311 if (BC_NUM_NONZERO(&intn)) { 3312 3313 // This divmod splits intn into the two inc parts. 3314 bc_num_divmod(&intn, &vm.max, &temp, &temp2, 0); 3315 3316 // Because temp2 is the mod of vm.max, from above, it is guaranteed 3317 // to be small enough to use bc_num_bigdig2(). 3318 inc1 = (BcRand) bc_num_bigdig2(&temp2); 3319 3320 // Clamp the second inc part. 3321 if (bc_num_cmp(&temp, &vm.max) >= 0) { 3322 bc_num_copy(&temp2, &temp); 3323 bc_num_mod(&temp2, &vm.max, &temp, 0); 3324 } 3325 3326 // The if statement above ensures that temp is less than vm.max, which 3327 // means that we can use bc_num_bigdig2() here. 3328 inc2 = (BcRand) bc_num_bigdig2(&temp); 3329 } 3330 else inc1 = inc2 = 0; 3331 3332 bc_rand_seed(rng, state1, state2, inc1, inc2); 3333 3334 err: 3335 BC_SIG_MAYLOCK; 3336 bc_num_free(&intn); 3337 bc_num_free(&frac); 3338 bc_num_free(&temp2); 3339 bc_num_free(&temp); 3340 BC_LONGJMP_CONT; 3341 } 3342 3343 void bc_num_createFromRNG(BcNum *restrict n, BcRNG *rng) { 3344 3345 BcRand s1, s2, i1, i2; 3346 BcNum conv, temp1, temp2, temp3; 3347 BcDig temp1_num[BC_RAND_NUM_SIZE], temp2_num[BC_RAND_NUM_SIZE]; 3348 BcDig conv_num[BC_NUM_BIGDIG_LOG10]; 3349 3350 BC_SIG_LOCK; 3351 3352 bc_num_init(&temp3, 2 * BC_RAND_NUM_SIZE); 3353 3354 BC_SETJMP_LOCKED(err); 3355 3356 BC_SIG_UNLOCK; 3357 3358 bc_num_setup(&temp1, temp1_num, sizeof(temp1_num) / sizeof(BcDig)); 3359 bc_num_setup(&temp2, temp2_num, sizeof(temp2_num) / sizeof(BcDig)); 3360 bc_num_setup(&conv, conv_num, sizeof(conv_num) / sizeof(BcDig)); 3361 3362 // This assert is here because it has to be true. It is also here to justify 3363 // the assumption that vm.max is not zero. 3364 assert(BC_NUM_NONZERO(&vm.max)); 3365 3366 // Because this is true, we can just ignore math errors that would happen 3367 // otherwise. 3368 assert(BC_NUM_NONZERO(&vm.max2)); 3369 3370 bc_rand_getRands(rng, &s1, &s2, &i1, &i2); 3371 3372 // Put the second piece of state into a number. 3373 bc_num_bigdig2num(&conv, (BcBigDig) s2); 3374 3375 assert(BC_NUM_RDX_VALID_NP(conv)); 3376 3377 // Multiply by max to make room for the first piece of state. 3378 bc_num_mul(&conv, &vm.max, &temp1, 0); 3379 3380 // Add in the first piece of state. 3381 bc_num_bigdig2num(&conv, (BcBigDig) s1); 3382 bc_num_add(&conv, &temp1, &temp2, 0); 3383 3384 // Divide to make it an entirely fractional part. 3385 bc_num_div(&temp2, &vm.max2, &temp3, BC_RAND_STATE_BITS); 3386 3387 // Now start on the increment parts. It's the same process without the 3388 // divide, so put the second piece of increment into a number. 3389 bc_num_bigdig2num(&conv, (BcBigDig) i2); 3390 3391 assert(BC_NUM_RDX_VALID_NP(conv)); 3392 3393 // Multiply by max to make room for the first piece of increment. 3394 bc_num_mul(&conv, &vm.max, &temp1, 0); 3395 3396 // Add in the first piece of increment. 3397 bc_num_bigdig2num(&conv, (BcBigDig) i1); 3398 bc_num_add(&conv, &temp1, &temp2, 0); 3399 3400 // Now add the two together. 3401 bc_num_add(&temp2, &temp3, n, 0); 3402 3403 assert(BC_NUM_RDX_VALID(n)); 3404 3405 err: 3406 BC_SIG_MAYLOCK; 3407 bc_num_free(&temp3); 3408 BC_LONGJMP_CONT; 3409 } 3410 3411 void bc_num_irand(BcNum *restrict a, BcNum *restrict b, BcRNG *restrict rng) { 3412 3413 BcNum atemp; 3414 size_t i, len; 3415 3416 assert(a != b); 3417 3418 if (BC_ERR(BC_NUM_NEG(a))) bc_err(BC_ERR_MATH_NEGATIVE); 3419 3420 // If either of these are true, then the numbers are integers. 3421 if (BC_NUM_ZERO(a) || BC_NUM_ONE(a)) return; 3422 3423 if (BC_ERR(bc_num_nonInt(a, &atemp))) bc_err(BC_ERR_MATH_NON_INTEGER); 3424 3425 assert(atemp.len); 3426 3427 len = atemp.len - 1; 3428 3429 // Just generate a random number for each limb. 3430 for (i = 0; i < len; ++i) 3431 b->num[i] = (BcDig) bc_rand_bounded(rng, BC_BASE_POW); 3432 3433 // Do the last digit explicitly because the bound must be right. But only 3434 // do it if the limb does not equal 1. If it does, we have already hit the 3435 // limit. 3436 if (atemp.num[i] != 1) { 3437 b->num[i] = (BcDig) bc_rand_bounded(rng, (BcRand) atemp.num[i]); 3438 b->len = atemp.len; 3439 } 3440 // We want 1 less len in the case where we skip the last limb. 3441 else b->len = len; 3442 3443 bc_num_clean(b); 3444 3445 assert(BC_NUM_RDX_VALID(b)); 3446 } 3447 #endif // BC_ENABLE_EXTRA_MATH 3448 3449 size_t bc_num_addReq(const BcNum *a, const BcNum *b, size_t scale) { 3450 3451 size_t aint, bint, ardx, brdx; 3452 3453 // Addition and subtraction require the max of the length of the two numbers 3454 // plus 1. 3455 3456 BC_UNUSED(scale); 3457 3458 ardx = BC_NUM_RDX_VAL(a); 3459 aint = bc_num_int(a); 3460 assert(aint <= a->len && ardx <= a->len); 3461 3462 brdx = BC_NUM_RDX_VAL(b); 3463 bint = bc_num_int(b); 3464 assert(bint <= b->len && brdx <= b->len); 3465 3466 ardx = BC_MAX(ardx, brdx); 3467 aint = BC_MAX(aint, bint); 3468 3469 return bc_vm_growSize(bc_vm_growSize(ardx, aint), 1); 3470 } 3471 3472 size_t bc_num_mulReq(const BcNum *a, const BcNum *b, size_t scale) { 3473 3474 size_t max, rdx; 3475 3476 // Multiplication requires the sum of the lengths of the numbers. 3477 3478 rdx = bc_vm_growSize(BC_NUM_RDX_VAL(a), BC_NUM_RDX_VAL(b)); 3479 3480 max = BC_NUM_RDX(scale); 3481 3482 max = bc_vm_growSize(BC_MAX(max, rdx), 1); 3483 rdx = bc_vm_growSize(bc_vm_growSize(bc_num_int(a), bc_num_int(b)), max); 3484 3485 return rdx; 3486 } 3487 3488 size_t bc_num_divReq(const BcNum *a, const BcNum *b, size_t scale) { 3489 3490 size_t max, rdx; 3491 3492 // Division requires the length of the dividend plus the scale. 3493 3494 rdx = bc_vm_growSize(BC_NUM_RDX_VAL(a), BC_NUM_RDX_VAL(b)); 3495 3496 max = BC_NUM_RDX(scale); 3497 3498 max = bc_vm_growSize(BC_MAX(max, rdx), 1); 3499 rdx = bc_vm_growSize(bc_num_int(a), max); 3500 3501 return rdx; 3502 } 3503 3504 size_t bc_num_powReq(const BcNum *a, const BcNum *b, size_t scale) { 3505 BC_UNUSED(scale); 3506 return bc_vm_growSize(bc_vm_growSize(a->len, b->len), 1); 3507 } 3508 3509 #if BC_ENABLE_EXTRA_MATH 3510 size_t bc_num_placesReq(const BcNum *a, const BcNum *b, size_t scale) { 3511 BC_UNUSED(scale); 3512 return a->len + b->len - BC_NUM_RDX_VAL(a) - BC_NUM_RDX_VAL(b); 3513 } 3514 #endif // BC_ENABLE_EXTRA_MATH 3515 3516 void bc_num_add(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3517 assert(BC_NUM_RDX_VALID(a)); 3518 assert(BC_NUM_RDX_VALID(b)); 3519 bc_num_binary(a, b, c, false, bc_num_as, bc_num_addReq(a, b, scale)); 3520 } 3521 3522 void bc_num_sub(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3523 assert(BC_NUM_RDX_VALID(a)); 3524 assert(BC_NUM_RDX_VALID(b)); 3525 bc_num_binary(a, b, c, true, bc_num_as, bc_num_addReq(a, b, scale)); 3526 } 3527 3528 void bc_num_mul(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3529 assert(BC_NUM_RDX_VALID(a)); 3530 assert(BC_NUM_RDX_VALID(b)); 3531 bc_num_binary(a, b, c, scale, bc_num_m, bc_num_mulReq(a, b, scale)); 3532 } 3533 3534 void bc_num_div(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3535 assert(BC_NUM_RDX_VALID(a)); 3536 assert(BC_NUM_RDX_VALID(b)); 3537 bc_num_binary(a, b, c, scale, bc_num_d, bc_num_divReq(a, b, scale)); 3538 } 3539 3540 void bc_num_mod(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3541 assert(BC_NUM_RDX_VALID(a)); 3542 assert(BC_NUM_RDX_VALID(b)); 3543 bc_num_binary(a, b, c, scale, bc_num_rem, bc_num_divReq(a, b, scale)); 3544 } 3545 3546 void bc_num_pow(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3547 assert(BC_NUM_RDX_VALID(a)); 3548 assert(BC_NUM_RDX_VALID(b)); 3549 bc_num_binary(a, b, c, scale, bc_num_p, bc_num_powReq(a, b, scale)); 3550 } 3551 3552 #if BC_ENABLE_EXTRA_MATH 3553 void bc_num_places(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3554 assert(BC_NUM_RDX_VALID(a)); 3555 assert(BC_NUM_RDX_VALID(b)); 3556 bc_num_binary(a, b, c, scale, bc_num_place, bc_num_placesReq(a, b, scale)); 3557 } 3558 3559 void bc_num_lshift(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3560 assert(BC_NUM_RDX_VALID(a)); 3561 assert(BC_NUM_RDX_VALID(b)); 3562 bc_num_binary(a, b, c, scale, bc_num_left, bc_num_placesReq(a, b, scale)); 3563 } 3564 3565 void bc_num_rshift(BcNum *a, BcNum *b, BcNum *c, size_t scale) { 3566 assert(BC_NUM_RDX_VALID(a)); 3567 assert(BC_NUM_RDX_VALID(b)); 3568 bc_num_binary(a, b, c, scale, bc_num_right, bc_num_placesReq(a, b, scale)); 3569 } 3570 #endif // BC_ENABLE_EXTRA_MATH 3571 3572 void bc_num_sqrt(BcNum *restrict a, BcNum *restrict b, size_t scale) { 3573 3574 BcNum num1, num2, half, f, fprime, *x0, *x1, *temp; 3575 size_t pow, len, rdx, req, resscale; 3576 BcDig half_digs[1]; 3577 3578 assert(a != NULL && b != NULL && a != b); 3579 3580 if (BC_ERR(BC_NUM_NEG(a))) bc_err(BC_ERR_MATH_NEGATIVE); 3581 3582 // We want to calculate to a's scale if it is bigger so that the result will 3583 // truncate properly. 3584 if (a->scale > scale) scale = a->scale; 3585 3586 // Set parameters for the result. 3587 len = bc_vm_growSize(bc_num_intDigits(a), 1); 3588 rdx = BC_NUM_RDX(scale); 3589 3590 // Square root needs half of the length of the parameter. 3591 req = bc_vm_growSize(BC_MAX(rdx, BC_NUM_RDX_VAL(a)), len >> 1); 3592 3593 BC_SIG_LOCK; 3594 3595 // Unlike the binary operators, this function is the only single parameter 3596 // function and is expected to initialize the result. This means that it 3597 // expects that b is *NOT* preallocated. We allocate it here. 3598 bc_num_init(b, bc_vm_growSize(req, 1)); 3599 3600 BC_SIG_UNLOCK; 3601 3602 assert(a != NULL && b != NULL && a != b); 3603 assert(a->num != NULL && b->num != NULL); 3604 3605 // Easy case. 3606 if (BC_NUM_ZERO(a)) { 3607 bc_num_setToZero(b, scale); 3608 return; 3609 } 3610 3611 // Another easy case. 3612 if (BC_NUM_ONE(a)) { 3613 bc_num_one(b); 3614 bc_num_extend(b, scale); 3615 return; 3616 } 3617 3618 // Set the parameters again. 3619 rdx = BC_NUM_RDX(scale); 3620 rdx = BC_MAX(rdx, BC_NUM_RDX_VAL(a)); 3621 len = bc_vm_growSize(a->len, rdx); 3622 3623 BC_SIG_LOCK; 3624 3625 bc_num_init(&num1, len); 3626 bc_num_init(&num2, len); 3627 bc_num_setup(&half, half_digs, sizeof(half_digs) / sizeof(BcDig)); 3628 3629 // There is a division by two in the formula. We setup a number that's 1/2 3630 // so that we can use multiplication instead of heavy division. 3631 bc_num_one(&half); 3632 half.num[0] = BC_BASE_POW / 2; 3633 half.len = 1; 3634 BC_NUM_RDX_SET_NP(half, 1); 3635 half.scale = 1; 3636 3637 bc_num_init(&f, len); 3638 bc_num_init(&fprime, len); 3639 3640 BC_SETJMP_LOCKED(err); 3641 3642 BC_SIG_UNLOCK; 3643 3644 // Pointers for easy switching. 3645 x0 = &num1; 3646 x1 = &num2; 3647 3648 // Start with 1. 3649 bc_num_one(x0); 3650 3651 // The power of the operand is needed for the estimate. 3652 pow = bc_num_intDigits(a); 3653 3654 // The code in this if statement calculates the initial estimate. First, if 3655 // a is less than 0, then 0 is a good estimate. Otherwise, we want something 3656 // in the same ballpark. That ballpark is pow. 3657 if (pow) { 3658 3659 // An odd number is served by starting with 2^((pow-1)/2), and an even 3660 // number is served by starting with 6^((pow-2)/2). Why? Because math. 3661 if (pow & 1) x0->num[0] = 2; 3662 else x0->num[0] = 6; 3663 3664 pow -= 2 - (pow & 1); 3665 bc_num_shiftLeft(x0, pow / 2); 3666 } 3667 3668 // I can set the rdx here directly because neg should be false. 3669 x0->scale = x0->rdx = 0; 3670 resscale = (scale + BC_BASE_DIGS) + 2; 3671 3672 // This is the calculation loop. This compare goes to 0 eventually as the 3673 // difference between the two numbers gets smaller than resscale. 3674 while (bc_num_cmp(x1, x0)) { 3675 3676 assert(BC_NUM_NONZERO(x0)); 3677 3678 // This loop directly corresponds to the iteration in Newton's method. 3679 // If you know the formula, this loop makes sense. Go study the formula. 3680 3681 bc_num_div(a, x0, &f, resscale); 3682 bc_num_add(x0, &f, &fprime, resscale); 3683 3684 assert(BC_NUM_RDX_VALID_NP(fprime)); 3685 assert(BC_NUM_RDX_VALID_NP(half)); 3686 3687 bc_num_mul(&fprime, &half, x1, resscale); 3688 3689 // Switch. 3690 temp = x0; 3691 x0 = x1; 3692 x1 = temp; 3693 } 3694 3695 // Copy to the result and truncate. 3696 bc_num_copy(b, x0); 3697 if (b->scale > scale) bc_num_truncate(b, b->scale - scale); 3698 3699 assert(!BC_NUM_NEG(b) || BC_NUM_NONZERO(b)); 3700 assert(BC_NUM_RDX_VALID(b)); 3701 assert(BC_NUM_RDX_VAL(b) <= b->len || !b->len); 3702 assert(!b->len || b->num[b->len - 1] || BC_NUM_RDX_VAL(b) == b->len); 3703 3704 err: 3705 BC_SIG_MAYLOCK; 3706 bc_num_free(&fprime); 3707 bc_num_free(&f); 3708 bc_num_free(&num2); 3709 bc_num_free(&num1); 3710 BC_LONGJMP_CONT; 3711 } 3712 3713 void bc_num_divmod(BcNum *a, BcNum *b, BcNum *c, BcNum *d, size_t scale) { 3714 3715 size_t ts, len; 3716 BcNum *ptr_a, num2; 3717 bool init = false; 3718 3719 // The bulk of this function is just doing what bc_num_binary() does for the 3720 // binary operators. However, it assumes that only c and a can be equal. 3721 3722 // Set up the parameters. 3723 ts = BC_MAX(scale + b->scale, a->scale); 3724 len = bc_num_mulReq(a, b, ts); 3725 3726 assert(a != NULL && b != NULL && c != NULL && d != NULL); 3727 assert(c != d && a != d && b != d && b != c); 3728 3729 // Initialize or expand as necessary. 3730 if (c == a) { 3731 3732 memcpy(&num2, c, sizeof(BcNum)); 3733 ptr_a = &num2; 3734 3735 BC_SIG_LOCK; 3736 3737 bc_num_init(c, len); 3738 3739 init = true; 3740 3741 BC_SETJMP_LOCKED(err); 3742 3743 BC_SIG_UNLOCK; 3744 } 3745 else { 3746 ptr_a = a; 3747 bc_num_expand(c, len); 3748 } 3749 3750 // Do the quick version if possible. 3751 if (BC_NUM_NONZERO(a) && !BC_NUM_RDX_VAL(a) && 3752 !BC_NUM_RDX_VAL(b) && b->len == 1 && !scale) 3753 { 3754 BcBigDig rem; 3755 3756 bc_num_divArray(ptr_a, (BcBigDig) b->num[0], c, &rem); 3757 3758 assert(rem < BC_BASE_POW); 3759 3760 d->num[0] = (BcDig) rem; 3761 d->len = (rem != 0); 3762 } 3763 // Do the slow method. 3764 else bc_num_r(ptr_a, b, c, d, scale, ts); 3765 3766 assert(!BC_NUM_NEG(c) || BC_NUM_NONZERO(c)); 3767 assert(BC_NUM_RDX_VALID(c)); 3768 assert(BC_NUM_RDX_VAL(c) <= c->len || !c->len); 3769 assert(!c->len || c->num[c->len - 1] || BC_NUM_RDX_VAL(c) == c->len); 3770 assert(!BC_NUM_NEG(d) || BC_NUM_NONZERO(d)); 3771 assert(BC_NUM_RDX_VALID(d)); 3772 assert(BC_NUM_RDX_VAL(d) <= d->len || !d->len); 3773 assert(!d->len || d->num[d->len - 1] || BC_NUM_RDX_VAL(d) == d->len); 3774 3775 err: 3776 // Only cleanup if we initialized. 3777 if (init) { 3778 BC_SIG_MAYLOCK; 3779 bc_num_free(&num2); 3780 BC_LONGJMP_CONT; 3781 } 3782 } 3783 3784 void bc_num_modexp(BcNum *a, BcNum *b, BcNum *c, BcNum *restrict d) { 3785 3786 BcNum base, exp, two, temp, atemp, btemp, ctemp; 3787 BcDig two_digs[2]; 3788 3789 assert(a != NULL && b != NULL && c != NULL && d != NULL); 3790 assert(a != d && b != d && c != d); 3791 3792 if (BC_ERR(BC_NUM_ZERO(c))) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO); 3793 3794 if (BC_ERR(BC_NUM_NEG(b))) bc_err(BC_ERR_MATH_NEGATIVE); 3795 3796 #ifndef NDEBUG 3797 // This is entirely for quieting a useless scan-build error. 3798 btemp.len = 0; 3799 ctemp.len = 0; 3800 #endif // NDEBUG 3801 3802 // Eliminate fractional parts that are zero or error if they are not zero. 3803 if (BC_ERR(bc_num_nonInt(a, &atemp) || bc_num_nonInt(b, &btemp) || 3804 bc_num_nonInt(c, &ctemp))) 3805 { 3806 bc_err(BC_ERR_MATH_NON_INTEGER); 3807 } 3808 3809 bc_num_expand(d, ctemp.len); 3810 3811 BC_SIG_LOCK; 3812 3813 bc_num_init(&base, ctemp.len); 3814 bc_num_setup(&two, two_digs, sizeof(two_digs) / sizeof(BcDig)); 3815 bc_num_init(&temp, btemp.len + 1); 3816 bc_num_createCopy(&exp, &btemp); 3817 3818 BC_SETJMP_LOCKED(err); 3819 3820 BC_SIG_UNLOCK; 3821 3822 bc_num_one(&two); 3823 two.num[0] = 2; 3824 bc_num_one(d); 3825 3826 // We already checked for 0. 3827 bc_num_rem(&atemp, &ctemp, &base, 0); 3828 3829 // If you know the algorithm I used, the memory-efficient method, then this 3830 // loop should be self-explanatory because it is the calculation loop. 3831 while (BC_NUM_NONZERO(&exp)) { 3832 3833 // Num two cannot be 0, so no errors. 3834 bc_num_divmod(&exp, &two, &exp, &temp, 0); 3835 3836 if (BC_NUM_ONE(&temp) && !BC_NUM_NEG_NP(temp)) { 3837 3838 assert(BC_NUM_RDX_VALID(d)); 3839 assert(BC_NUM_RDX_VALID_NP(base)); 3840 3841 bc_num_mul(d, &base, &temp, 0); 3842 3843 // We already checked for 0. 3844 bc_num_rem(&temp, &ctemp, d, 0); 3845 } 3846 3847 assert(BC_NUM_RDX_VALID_NP(base)); 3848 3849 bc_num_mul(&base, &base, &temp, 0); 3850 3851 // We already checked for 0. 3852 bc_num_rem(&temp, &ctemp, &base, 0); 3853 } 3854 3855 err: 3856 BC_SIG_MAYLOCK; 3857 bc_num_free(&exp); 3858 bc_num_free(&temp); 3859 bc_num_free(&base); 3860 BC_LONGJMP_CONT; 3861 assert(!BC_NUM_NEG(d) || d->len); 3862 assert(BC_NUM_RDX_VALID(d)); 3863 assert(!d->len || d->num[d->len - 1] || BC_NUM_RDX_VAL(d) == d->len); 3864 } 3865 3866 #if BC_DEBUG_CODE 3867 void bc_num_printDebug(const BcNum *n, const char *name, bool emptyline) { 3868 bc_file_puts(&vm.fout, bc_flush_none, name); 3869 bc_file_puts(&vm.fout, bc_flush_none, ": "); 3870 bc_num_printDecimal(n, true); 3871 bc_file_putchar(&vm.fout, bc_flush_err, '\n'); 3872 if (emptyline) bc_file_putchar(&vm.fout, bc_flush_err, '\n'); 3873 vm.nchars = 0; 3874 } 3875 3876 void bc_num_printDigs(const BcDig *n, size_t len, bool emptyline) { 3877 3878 size_t i; 3879 3880 for (i = len - 1; i < len; --i) 3881 bc_file_printf(&vm.fout, " %lu", (unsigned long) n[i]); 3882 3883 bc_file_putchar(&vm.fout, bc_flush_err, '\n'); 3884 if (emptyline) bc_file_putchar(&vm.fout, bc_flush_err, '\n'); 3885 vm.nchars = 0; 3886 } 3887 3888 void bc_num_printWithDigs(const BcNum *n, const char *name, bool emptyline) { 3889 bc_file_puts(&vm.fout, bc_flush_none, name); 3890 bc_file_printf(&vm.fout, " len: %zu, rdx: %zu, scale: %zu\n", 3891 name, n->len, BC_NUM_RDX_VAL(n), n->scale); 3892 bc_num_printDigs(n->num, n->len, emptyline); 3893 } 3894 3895 void bc_num_dump(const char *varname, const BcNum *n) { 3896 3897 ulong i, scale = n->scale; 3898 3899 bc_file_printf(&vm.ferr, "\n%s = %s", varname, 3900 n->len ? (BC_NUM_NEG(n) ? "-" : "+") : "0 "); 3901 3902 for (i = n->len - 1; i < n->len; --i) { 3903 3904 if (i + 1 == BC_NUM_RDX_VAL(n)) 3905 bc_file_puts(&vm.ferr, bc_flush_none, ". "); 3906 3907 if (scale / BC_BASE_DIGS != BC_NUM_RDX_VAL(n) - i - 1) 3908 bc_file_printf(&vm.ferr, "%lu ", (unsigned long) n->num[i]); 3909 else { 3910 3911 int mod = scale % BC_BASE_DIGS; 3912 int d = BC_BASE_DIGS - mod; 3913 BcDig div; 3914 3915 if (mod != 0) { 3916 div = n->num[i] / ((BcDig) bc_num_pow10[(ulong) d]); 3917 bc_file_printf(&vm.ferr, "%lu", (unsigned long) div); 3918 } 3919 3920 div = n->num[i] % ((BcDig) bc_num_pow10[(ulong) d]); 3921 bc_file_printf(&vm.ferr, " ' %lu ", (unsigned long) div); 3922 } 3923 } 3924 3925 bc_file_printf(&vm.ferr, "(%zu | %zu.%zu / %zu) %lu\n", 3926 n->scale, n->len, BC_NUM_RDX_VAL(n), n->cap, 3927 (unsigned long) (void*) n->num); 3928 3929 bc_file_flush(&vm.ferr, bc_flush_err); 3930 } 3931 #endif // BC_DEBUG_CODE 3932