Fórum Não apresenta erro de divisão por zero. #500400

06/11/2014

0

Pessoal boa tarde, tenho uma rotina que faz basicamente o seguinte:

try
wsComFim := ((wsQtdIni * wsComIni) - (wsQtdSai * wsComEnt)) / (wsQtdIni - wsQtdSai);
wsSemFim := ((wsQtdIni * wsSemIni) - (wsQtdSai * wsSemEnt)) / (wsQtdIni - wsQtdSai);
except
wsComFim := 123;
wsSemFim := 124;
end;

O valor de (wsQtdIni - wsQtdSai) é 0 (zero)
Logo isso deveria causar uma exceção e cair na linha do Except.
Porem ao invés disso o valor das variáveis wsComFim = -INF

Alguém sabe o que pode ser isso ????

[img]http://arquivo.devmedia.com.br/forum/imagem/70295-20141106-181411.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/70295-20141106-181428%20%281%29.png[/img]
Pa Informatica

Pa Informatica

Responder

Posts

07/11/2014

Cleverson

Oh entre parenteses retorna um boolean correto?
Responder

Gostei + 0

07/11/2014

Claudio Ferreira

Talvez seja o ponto flutuante e que wsComFim não seja exatamente zero mas 0.000000000000001 por exemplo

Troque o tipo de wsComFim para integer e / por div e vai cair na exceção
Responder

Gostei + 0

08/11/2014

Pa Informatica

Dentro do parentesis é tudo Real.
Responder

Gostei + 0

08/11/2014

Pa Informatica

Dentro do parenteses é tudo Real.
Responder

Gostei + 0

08/11/2014

Pa Informatica

Dentro do parenteses é tudo Real.
Responder

Gostei + 0

08/11/2014

Pa Informatica

Talvez seja o ponto flutuante e que wsComFim não seja exatamente zero mas 0.000000000000001 por exemplo

Troque o tipo de wsComFim para integer e / por div e vai cair na exceção


O valor é realmente 0 (zero) o proprio hint mostra.
Responder

Gostei + 0

09/11/2014

Marcos Saffran

Bom dia Pea,

criei um programa para verificar o que está ocorrendo e, para meu espando, o cálculo de uma divisão de dois números não é feito, o programa simplesmente pula a linha de comando.
Portanto busquei na internet e encontrei o seguinte: Evitando erro

envio abaixo o programa para sua análise.

procedure TForm1.Button1Click(Sender: TObject);
var
x, y : Integer;
resultado : double;
begin
try
x := 10;
y := 0;
resultado := x / y; // o programa pula essa linha (não sei porque)
resultado := Calc_Double_If(x / y);
showmessage('try - resultado = ' + FloatToStr(x / y));
except
showmessage('except');
end;

end;

function TForm1.Calc_Double_If(Numero: Double): Double;
begin
Calc_Double_If:= Numero;
end;

end.

Espero que nossos amigos do DevMedia possam explicar o ocorrido.
Responder

Gostei + 0

09/11/2014

Raylan Zibel

Se não conseguir posicionar o marcador do debug na linha que ele está pulando, creio que seja pq o debug já entendeu que aquela linha não faz o menor sentido ser processada. Inevitavelmente vai dar erro, já que voce está informando que é pra dividir 10 pro 0.
Responder

Gostei + 0

09/11/2014

Marcos Saffran

Acontece que se eu colocar o valor de y := 5, também pula a linha e não dá erro na linha
resultado := x / y; // o programa pula essa linha (não sei porque)
o erro ocorre na linha abaixo.
Responder

Gostei + 0

10/11/2014

Pa Informatica

Vou fazer o teste e aviso.
O estranho é que no delphi 7 ele apresenta o erro de divisão por zero.
Responder

Gostei + 0

10/11/2014

Claudio Ferreira

Talvez seja o ponto flutuante e que wsComFim não seja exatamente zero mas 0.000000000000001 por exemplo

Troque o tipo de wsComFim para integer e / por div e vai cair na exceção


O valor é realmente 0 (zero) o proprio hint mostra.


Não é zero, o Hint arredonda para mostrar. Mas o real conteúdo voce não vê.
Responder

Gostei + 0

13/11/2014

Pa Informatica

E por que o valor fica como -INF ???
De onde saiu isso ?
Responder

Gostei + 0

17/11/2014

Claudio Ferreira

Não sei o motivo do -INF, mas tenho impressão que é um número muito pequeno fracionado que a IDE não conseguiu mostrar. (chute)

só sei que se voce transformar para Integer vai soltar a exceção de divisão por zero, coloque o Trunc para converter para inteiro, assim :

/ Trunc (wsQtdIni - wsQtdSai);
Responder

Gostei + 0

22/11/2014

Pa Informatica

Ola pessoal, tive uma luz do que esta ocorrendo, um colega me passou o seguinte link.

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/compdirsfinitefloat_xml.html

Agora já sei o que esta ocorrendo mas não sei como corrigir.

Tentei colocar a diretiva {$FINITEFLOAT ON} em diversos lugares mais nada funciona.

Se alguém tiver uma luz agradeço
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar