Esempio n. 1
0
File: bignum.c Progetto: rtfb/82k
void bignum_print_int(bignum *n) {
    if (n->size > 4) {
        printf("<Inf>\n");
        return;
    }
    printf("%u\n", bignum_to_int(n));
}
Esempio n. 2
0
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;
    }
}
Esempio n. 3
0
File: bignum.c Progetto: rtfb/82k
// 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;
    }
}