Não apresenta erro de divisão por zero.
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]
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
Curtidas 0
Respostas
Cleverson
06/11/2014
Oh entre parenteses retorna um boolean correto?
GOSTEI 0
Claudio Ferreira
06/11/2014
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
Troque o tipo de wsComFim para integer e / por div e vai cair na exceção
GOSTEI 0
Pa Informatica
06/11/2014
Dentro do parentesis é tudo Real.
GOSTEI 0
Pa Informatica
06/11/2014
Dentro do parenteses é tudo Real.
GOSTEI 0
Pa Informatica
06/11/2014
Dentro do parenteses é tudo Real.
GOSTEI 0
Pa Informatica
06/11/2014
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
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.
GOSTEI 0
Marcos Saffran
06/11/2014
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.
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.
GOSTEI 0
Raylan Zibel
06/11/2014
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.
GOSTEI 0
Marcos Saffran
06/11/2014
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.
resultado := x / y; // o programa pula essa linha (não sei porque)
o erro ocorre na linha abaixo.
GOSTEI 0
Pa Informatica
06/11/2014
Vou fazer o teste e aviso.
O estranho é que no delphi 7 ele apresenta o erro de divisão por zero.
O estranho é que no delphi 7 ele apresenta o erro de divisão por zero.
GOSTEI 0
Claudio Ferreira
06/11/2014
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
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ê.
GOSTEI 0
Pa Informatica
06/11/2014
E por que o valor fica como -INF ???
De onde saiu isso ?
De onde saiu isso ?
GOSTEI 0
Claudio Ferreira
06/11/2014
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);
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);
GOSTEI 0
Pa Informatica
06/11/2014
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
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
GOSTEI 0