function val = trocabase(p,b,ndig_frac,t) n = floor(p); f = p - n; % parte inteira i = 1; d(i) = 0; while ( n ~= 0 ) q = floor(n/b); r = n - q*b; d(i) = r; i = i + 1; n = q; end ndig_int = i - 1; % parte fracionaria for i=1:ndig_frac g = f*b; digf = floor(g); e(i) = digf; m = g - floor(g); f = m; end % reconstrucao do numero em base b % truncando a ndig_frac digitos apos a virgula (para imprimir na tela) out = 0; for k=1:ndig_int out = out + d(k)*10^(k-1); end for k=1:ndig_frac out = out + e(k)*10^(-k); end format long g; % isto e para imprimir o numero com mais digitos apos a virgula % reconstruindo parte inteira do numero (em base decimal), % mas limitando-se a t digitos da mantissa kk = min(t,ndig_int); outb = 0; for i=1:kk j = ndig_int - i + 1; outb = outb + d(j)*b^(j-1); end outb2 = outb + 1.0*b^(j-1); % verificando se ainda ha digitos disponiveis % na mantissa para a parte fracionaria if ( t > kk ) for i=1:t-kk outb = outb + e(i)*b^(-i); end outb2 = outb + 1.0*b^(-i); % i sai do loop valendo t-kk end if ( abs(outb-p) < abs(outb2-p) ) num = outb; else num = outb2; end num % numero mais proximo do numero dado p (ja convertido em base 10) % numero obtido apos a mudar para a base b (output da funcao trocabase.m) % o qual esta truncado a ndig_frac apos a virgula (ou ponto) val = out; return end