Calcule em MatLab/Octave o maior
! até causar overflow (resultado Inf) nas precisão simples e dupla. Imprime
e
! (o padrão em MatLab é a precisão dupla, para trabalhar com a precisão simples usem o comando single (n)).
Passo 1
O enunciado pede para descobrir, em MATLAB/Octave, o maior inteiro
tal que
ainda cabe na memória antes de estourar para Inf (overflow), nas duas precisões padrão do MATLAB:
– precisão simples (IEEE- single)
– precisão dupla (IEEE- double)
Para isso vamos usar um laço que calcula incrementalmente e testa com a função
– precisão simples (IEEE-
– precisão dupla (IEEE-
Para isso vamos usar um laço que calcula
isfinite
até o resultado virar Inf.Passo 2
Lembrando os limites das duas precisões:
single armazena valores até cerca de
Quando o fatorial passar desses limites, o MATLAB retorna
Inf
.Passo 3
Montamos dois laços em Octave/Matlab. A versão em precisão dupla (padrão) é:
n \(=1\);
f \(=1\); % começa com \(1\)! \(=1\)
while isfinite(f)
n \(=\) n \(+1\);
f \(=\) f * n;
end
\(n_max_double =\) n - \(1\); % último n válido
\(f_double =\) f / n; % f ficou em Inf, voltamos um passo
Para a precisão simples, convertendo cada fator para
single
, fazemos:n \(=1\);
f \(=\) single(\(1\)); % single precision
while isfinite(f)
n \(=\) n \(+1\);
f \(=\) f * single(n);
end
\(n_max_single =\) n - \(1\);
\(f_single =\) f / single(n);
Passo 4
Executando esses scripts em Octave/Matlab obtemos:
– na precisão simples, o laço pára em produzindo .
– na precisão dupla, o laço pára em produzindo .
– na precisão simples, o laço pára em
Inf
, logo o maior fatorial válido é para
– na precisão dupla, o laço pára em
Inf
, logo o maior fatorial válido é para
Resposta
Precisão simples:
Precisão dupla: