void bignum_print_int(bignum *n) { if (n->size > 4) { printf("<Inf>\n"); return; } printf("%u\n", bignum_to_int(n)); }
int basic_raw_int_conv( obj a ) { if (FIXNUM_P( a )) { return fx2int( a ); } if (LONG_INT_P( a )) { INT_64 i = extract_int_64( a ); if (int_64_fit_in_32_q( i )) { return int_64_to_int_32( i ); } else { scheme_error( "long int ~s is out of range for a raw int", 1, a ); return 0; } } #if FULL_NUMERIC_TOWER else if (BIGNUM_P( a )) { mpz_t z; OBJ_TO_MPZ( z, a ); if (bignum_fit_in_32( z )) { return bignum_to_int( z ); } else { scheme_error( "bignum ~s is out of range for a raw int", 1, a ); return 0; } } #endif else { scheme_error( "cannot convert ~s to an exact integer", 1, a ); return 0; } }
// remainder is optional void bignum_div_mod(bignum *a, bignum *b, bignum *remainder) { int i = a->size; unsigned int temp = 0; int bb = bignum_to_int(b); while (i > 0) { --i; temp <<= 8; temp |= a->data[i]; a->data[i] = temp / bb; temp -= a->data[i] * bb; } if (remainder) { bignum_from_int(remainder, temp); } while (a->size > 0 && a->data[a->size - 1] == 0) { --a->size; } if (a->size == 0) { a->size = 1; } }