Utilizando o Octave, investigue na prática o que ocorre quando uma operação numérica gera overflow ou underflow em aritmética de ponto flutuante.
Execute os seguintes comandos:
\mathrm{a}=1 \mathrm{e} 308 * 1 \mathrm{e} 10
\mathrm{b}=1 \mathrm{e}-308 / 1 \mathrm{e} 10
Com base nos resultados obtidos, responda:
(a) O que o OCTAVE retorna no caso da variável a? Esse resultado indica overflow ou underflow?
(b) O que o Octave retorna no caso da variável b? Esse resultado indica overflow ou underflow?
(c) Explique, com suas palavras, por que esses resultados ocorrem.
(d) Pesquise no Octave os comandos realmax e realmin. Compare os valores obtidos com os resultados anteriores.
No Octave, quando o resultado de uma operação excede o maior número representável, o sistema normalmente retorna Inf. Quando o resultado possui magnitude menor que o menor número positivo representável, o sistema pode retornar 0.

Passo 1

O enunciado pede que eu execute no Octave duas operações e, com base nos resultados, responda quatro itens. Vou listar claramente o que é pedido e quais são os dados fornecidos.
  • Comandos para executar no Octave (escritos aqui com notação matemática):
    • \text{a} = 1\times10^{308} \times 1\times10^{10}
    • \text{b} = 1\times10^{-308} \div 1\times10^{10}
  • Perguntas a responder:
    (a) O que o Octave retorna para a variável \text{a}? Isso indica overflow ou underflow?
    (b) O que o Octave retorna para a variável \text{b}? Isso indica overflow ou underflow?
    (c) Explicar, em palavras, por que esses resultados ocorrem.
    (d) Usar os comandos \text{realmax} e \text{realmin} no Octave e comparar os valores obtidos com os resultados anteriores.

Passo 2

Vou indicar os comandos que se executariam no Octave e o resultado esperado para \text{a}. Primeiro raciocínio simples do cálculo:
1\times10^{308}\times 1\times10^{10} = 1\times10^{318}.
Sabemos que números em ponto-flutuante de precisão dupla (o padrão do Octave) têm um maior valor finito representável chamado \text{realmax}. Como 1\times10^{318} é muito maior que esse limite, o Octave não consegue representar o resultado como um número finito. O comportamento conforme IEEE-754 é retornar infinito positivo. No Octave isso aparece como:
\text{a} = \mathrm{Inf}.
Este resultado indica overflow (o valor excedeu o maior número representável).

Passo 3

Agora a variável \text{b}. Primeiro cálculo direto:
1\times10^{-308}\div 1\times10^{10} = 1\times10^{-318}.
Compare esse valor com o menor número positivo normalizável ( \text{realmin}) no formato double: esse valor é da ordem de 10^{-308} (mais precisamente \approx 2{,}225\ldots\times10^{-308}). Logo 1\times10^{-318} é menor que \text{realmin}. Entretanto, a representação IEEE-754 de dupla precisão permite números denormalizados (subnormais) até um mínimo muito pequeno:
\text{menor subnormal} \approx 4{,}9406564584124654\times10^{-324}.
Como 1\times10^{-318} é bem maior que 4{,}94\times10^{-324}, ele está dentro da faixa dos subnormais e portanto pode ser representado (com menos precisão) como um número não nulo. Assim, o Octave normalmente imprime algo como
\text{b} \approx 1\times10^{-318}
(em notação arredondada). Isso não é um overflow; trata-se de um resultado “tímido” menor que \text{realmin} — é um caso de underflow em sentido estrito do flag IEEE (valor muito pequeno), mas o valor não foi levado a zero: foi representado como subnormal (gradual underflow).

Passo 4

Explicando a teoria por trás — aula curta, sem pular etapas:
  • Representação double (IEEE-754, usada pelo Octave): um número é armazenado como sinal, expoente e mantissa (fracionário). Há limites para o maior expoente e menor expoente normalizável.
  • O maior número finito aproximado (valor de \text{realmax}) é \text{realmax}\approx 1{,}7976931348623157\times10^{308}.Qualquer cálculo que produza um número maior que isso não pode ser representado como um número finito — o resultado torna-se \mathrm{Inf}. Isso é chamado de overflow.
  • O menor número positivo normalizado (valor de \text{realmin}) é \text{realmin}\approx 2{,}2250738585072014\times10^{-308}.Valores menores que \text{realmin} ainda podem ser representados como números subnormais (denormalizados) até o menor subnormal 2^{-1074}\approx 4{,}9406564584124654\times10^{-324}.Quando o resultado da operação está entre esse menor subnormal e \text{realmin}, o sistema usa representações subnormais (com menos precisão) — isso é chamado gradual underflow. Se o resultado tiver magnitude ainda menor que 2^{-1074}, ele é arredondado para zero (underflow absoluto, resultado = 0).

Passo 5

Comandos Octave úteis e comparação (indicar o que executar e o que eles retornam):
  • No Octave:
    • \text{realmax} retorna aproximadamente \text{realmax}() \approx 1{,}797693134862316\times10^{308}.
    • \text{realmin} retorna aproximadamente \text{realmin}() \approx 2{,}225073858507201\times10^{-308}.
  • Comparando com os resultados anteriores:
    • O valor calculado para \text{a} ( 1\times10^{318}) é muito maior que \text{realmax}, explicando o \mathrm{Inf}.
    • O valor calculado para \text{b} ( 1\times10^{-318}) é menor que \text{realmin} mas muito maior que o menor subnormal \approx 4{,}94\times10^{-324}, por isso é representável como subnormal em vez de zero.

Passo 6

Comentando comportamento prático no Octave e como detetar:
  • Para detectar overflow: use \text{isinf(a)} — devolve \text{true} se \text{a}=\mathrm{Inf}.
  • Para verificar se um número é finito: \text{isfinite(x)}.
  • Para ver se um resultado tiny virou zero: compare com zero ou use \text{b==0}.
  • Observação sobre flags: a CPU/IEEE pode ter bandeiras de exceção (overflow, underflow, inexact), mas o Octave normalmente não imprime essas flags automaticamente — em geral, o programador verifica valores especiais ( \mathrm{Inf}, \mathrm{NaN}, 0).

Passo 7

Resumo intuitivo (para lembrar na prova):
  • “Overflow” ocorre quando o resultado é maior que o maior número finito representável; Octave mostra \mathrm{Inf}. Ex.: \;1\times10^{308}\times1\times10^{10}\to\mathrm{Inf}.
  • “Underflow” no sentido de perder magnitude pode ocorrer de duas formas:
    • Gradual underflow: resultado fica menor que \text{realmin} mas maior que o menor subnormal; o sistema produz um número subnormal (não-zero, com menos precisão). Ex.: \;1\times10^{-318} tende a ser representado como subnormal, não zero.
    • Underflow absoluto: resultado é menor que o menor subnormal (aprox. 4{,}94\times10^{-324}); então o resultado é 0.
  • Lembre-se de comparar sempre com \text{realmax} e \text{realmin} para prever overflow/underflow.

Resposta

(a) \text{a} = \mathrm{Inf} — indica overflow.
(b) \text{b} \approx 1\times10^{-318} (valor subnormal, não zero) — é um caso de underflow gradual (não é overflow nem necessariamente zero).
(c) Porque números em double têm limites: se o resultado excede \text{realmax} vira \mathrm{Inf} (overflow); se o resultado fica abaixo de \text{realmin} pode ser representado como subnormal (gradual underflow) ou, se for menor que o menor subnormal \approx 4{,}94\times10^{-324}, arredondado para 0. No caso dado, 1\times10^{318}>\text{realmax} causa \mathrm{Inf}, e 1\times10^{-318}<\text{realmin} mas > menor subnormal, por isso resulta em um subnormal não nulo.
(d) \text{realmax}()\approx 1{,}797693134862316\times10^{308} e \text{realmin}()\approx 2{,}225073858507201\times10^{-308}. Comparando: 1\times10^{318}>\text{realmax} explica o \mathrm{Inf}; 1\times10^{-318}<\text{realmin} mas >4{,}94\times10^{-324} explica que o valor se torna subnormal (não zero).