version 1.1.1.2, 2000/09/09 14:12:58 |
version 1.1.1.3, 2003/08/25 16:06:34 |
|
|
character the integer X would have printed in base BASE. The |
character the integer X would have printed in base BASE. The |
approximation is never too small. |
approximation is never too small. |
|
|
Copyright (C) 1991, 1993, 1994, 1995 Free Software Foundation, Inc. |
Copyright 1991, 1993, 1994, 1995, 2001, 2002 Free Software Foundation, Inc. |
|
|
This file is part of the GNU MP Library. |
This file is part of the GNU MP Library. |
|
|
Line 26 MA 02111-1307, USA. */ |
|
Line 26 MA 02111-1307, USA. */ |
|
#include "longlong.h" |
#include "longlong.h" |
|
|
size_t |
size_t |
#if __STDC__ |
|
mpz_sizeinbase (mpz_srcptr x, int base) |
mpz_sizeinbase (mpz_srcptr x, int base) |
#else |
|
mpz_sizeinbase (x, base) |
|
mpz_srcptr x; |
|
int base; |
|
#endif |
|
{ |
{ |
mp_size_t size = ABS (x->_mp_size); |
size_t result; |
int lb_base, cnt; |
MPN_SIZEINBASE (result, PTR(x), ABSIZ(x), base); |
size_t totbits; |
return result; |
|
|
/* Special case for X == 0. */ |
|
if (size == 0) |
|
return 1; |
|
|
|
/* Calculate the total number of significant bits of X. */ |
|
count_leading_zeros (cnt, x->_mp_d[size - 1]); |
|
totbits = size * BITS_PER_MP_LIMB - cnt; |
|
|
|
if ((base & (base - 1)) == 0) |
|
{ |
|
/* Special case for powers of 2, giving exact result. */ |
|
|
|
count_leading_zeros (lb_base, base); |
|
lb_base = BITS_PER_MP_LIMB - lb_base - 1; |
|
|
|
return (totbits + lb_base - 1) / lb_base; |
|
} |
|
else |
|
return (size_t) (totbits * __mp_bases[base].chars_per_bit_exactly) + 1; |
|
} |
} |