Exceção de ponto flutuante C ++ Por que e o que é?

Exceção de ponto flutuante C ++ Por que e o que é?
Exceção de ponto flutuante ocorre quando um software tenta realizar uma operação inadequada em um número numérico. Esse tipo de exceção ocorre quando um usuário tenta executar operações inválidas, como a divisão por zero, divisão de um número negativo por um número par, pegando a raiz quadrada de um número negativo ou transbordamento de um cálculo que exceda o limite do limite do Tipo de dados duplo.

Em C ++, o “Sigfpe” O manipulador de sinal lida com o Exceções de ponto flutuante (FPES). Quando um usuário tenta realizar as tarefas mencionadas, esse manipulador de sinal é chamado. Depois que o manipulador de sinal interveio, ele imprime uma mensagem de erro para a saída padrão e interrompe o programa.

Por que as exceções de ponto flutuante ocorrem?

Exceções de ponto flutuante pode ocorrer devido a erros de programação ou quando um programa tenta processar um valor que está fora da especificação. Por exemplo, se um programa tenta dividir um número inteiro por zero, ou se um programa tentar pegar a raiz quadrada de um número negativo, um Exceção de ponto flutuante Vai acontecer. Além disso, alguns Exceções de ponto flutuante pode ocorrer devido a erros de processador.

Muitos fatores, como operação inadequada, subfluxo, transbordamento, divisão por zero e precisão, podem resultar em um Exceção de ponto flutuante. Vamos cobrir esses argumentos um por um nesta seção.

1: operação ilegal

Quando um usuário esquece de expressar uma operação ou a operação não tem valor matemático, o programa não é executado devido a uma operação inválida. Isso inclui cálculos como a raiz quadrada e o logaritmo de números negativos, por exemplo. Embora seja possível pegar a raiz quadrada de um número negativo ao lidar com números complexos, não há mecanismo baseado em computador para expressar isso.

Além disso, uma operação incorreta resultará se um software executar um ponto flutuante operação em um local somente inteiro. Isso se deve a uma incompatibilidade entre a operação que você está tentando realizar os dados (operação de ponto flutuante) e os dados armazenados (número inteiro).

2: divisão zero

A Exceção de ponto flutuante é jogado se você tentar dividir um número inteiro por zero. O mesmo ocorre quando você tenta se dividir por nan ou infinito. Aqui estão alguns exemplos: 1/0, log (0).

3: transbordamento

Quando uma operação retorna um valor que está fora de seu intervalo esperado, uma exceção de transbordamento acontece. O valor é mais ou inferior ao menor valor representável, de acordo com esta declaração.

4: Sublow

O subfluxo acontece quando um cálculo produz um resultado menor do que o tipo de dados pode conter.

5: inexato

Quando o resultado de uma operação difere do que foi antecipado, isso é conhecido como uma exceção inexata. Quando a operação é realizada com precisão não ligada e uma faixa de expoente, isso ocorre.

Em alguns casos, essas situações podem ser tratadas graciosamente. Por exemplo, quando um programa tenta dividir um número por zero, geralmente é preferível retornar uma mensagem de erro e encerrar graciosamente o programa, em vez de permitir que o programa trava.

#incluir
#incluir
usando namespace std;
Float Div (Float num, float den)

if (den == 0)
lançar RUNTime_error ("Erro matemático: tentou dividir por 0 \ n");

retornar (num / den);

int main ()

Float num, denom, resultado;
num = 10;
Denom = 0;
tentar
resultado = div (num, denom);
cout << "The quotient is " << result << endl;

Catch (RunTime_error & e)
cout << "Exception occurred" << endl << e.what();

Neste código, o Div A função é chamada pelo bloco de tentativa dentro de principal. Se o Denom não é igual a zero, o Div função retorna o quociente; Se for, um Exceção de erro de tempo de execução é jogado. Antes de ligar para o que função com o objeto de erro de tempo de execução e, o bloco de captura intercepta esta exceção e imprime o texto "Ocorreu um erro". É usado para identificar a exceção. A exceção padrão da classe, descrita no stDexcept arquivo de cabeçalho, tem uma função virtual chamada o que(). A mensagem “Erro matemático: tentou dividir por 0” é impresso como resultado.

Saída

Prevenir Exceções de ponto flutuante Em C ++, é essencial verificar todos os parâmetros passados ​​para funções, usar formatos apropriados e testar explicitamente divisores para valores zero. Além disso, ao usar tipos de dados duplos, é importante aumentar o intervalo do tipo de dados se o programa exigir maiores resultados aritméticos.

Conclusão

Exceções de ponto flutuante em C ++ são causados ​​por operações inválidas em valores numéricos e podem afetar a capacidade do programa de executar corretamente. Para evitar esses erros, é importante verificar todos os parâmetros passados ​​para funções e usar os tipos de dados apropriados. Além disso, é benéfico capturar Exceções de ponto flutuante.