Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Problema no Pascalzim Error Log: DOMAIN e Exp: OVERFLOW


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Olá Pessoal, Boa noite,

Estou iniciando agora na programação, fazendo um curso de algoritmo no Gustavo Guanabara e também nas horas livres aplicando na linguagem Pascal alguns comandos verificando pouco a pouco a estrutura, praticando no URI Online Judge os problemas iniciantes, nesse ponto chegou num exercício da plataforma que não estou entendendo muito bem, vou anexar aqui uma imagem do problema que está ocorrendo no Pascalzim. Mas antes vou dizer, consegui fazer o exemplo na descrição, somente o 3º Exemplo de Entrada e Saída, fiquei travado com o erro.

 

Link do problema no URI Online Judge URI Online Judge

 

Anexo

Contém Janela do Windows dividida com a visualização do meu código ao lado esquerdo no Pascalzim, e no lado direito ao executar e colocar o 3º Exemplo do Problema URI Online Judge, na parte inferior do lado direito Log: DOMAIN error  e na parte superior Exp: OVERFLOW error . 

 

Ficarei no aguardo de alguém me ajudar! Abraços!

 

01.jpg

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Loops Infinity A raiz quadrada não pode ser negativa, nesse link aqui explica mais sobre as funções padrões do pascal https://www.freepascal.org/docs-html/rtl/system/sqrt.html

recomendo usar um compilador de mais confiança, porque com esse ai você não ia achar o erro nunca, boas escolhas freepascal esse eu recomendo (da para usá-lo online pelo https://www.onlinegdb.com/) e o delphi alguma das versões express já servem.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@KXSY Olá Bom dia, então não entendi muito bem sobre a raiz quadrada não pode ser negativa , eu tentei acessar o link que enviou está dando erro 404 Not Found, vou tentar novamente mais tarde deve ser o servidor, sobre o compilador eu não instalei o FPC (Free Pascal Compiler), vou instalar também, joguei o meu código nesse link (https://www.onlinegdb.com/) também deu erro , é estranho porque nesse link do problema do exercício (URI Online Judge) eu tentei esse 1 e 2º Exemplo de Entrada e Saída (onde o 2º Ex. Entrada tem número negativo (x1 = -2.5 , y1 = 0.4 , x2 = 12.1 , y2 = 7.3 , logo o Ex. Saída '16.1484') funcionou nessa minha linha de código que fiz no Pascalzim.

 

O meu código é esse: 

Program URI_1015 ;
var
    x1, x2, y1, y2, d : real ;
Begin
    readln (x1, y1);
    readln (x2, y2);
    d := sqrt(exp(2*ln(x2-x1))+exp(2*ln(y2-y1)));
    Writeln (d:0:4);  
End.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

16 minutos atrás, Loops Infinity disse:

Olá Bom dia, então não entendi muito bem sobre a raiz quadrada não pode ser negativa

Você se deparou com um velho problema matemático de que números negativos não tem raiz quadrada, você tem que usar números complexos (ou era imaginários não me lembro bem).

Errocmp.png.3676d6cea6faaac1a9d9096df29c98bf.png

A tradução e " Se X é negativo então um erro em tempo de execução é gerado".

Se me lembro bem também logaritmos não tem negativo (ou em química eles tem, não lembro mesmo), geralmente esse tipo de função é você mesmo que tem que fazer, porque a biblioteca padrão não da suporte para fazer com números negativos.

33 minutos atrás, Loops Infinity disse:

eu tentei acessar o link que enviou está dando erro 404 Not Found

O link aqui está ok.

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@KXSY Estou muito feliz, consegui resolver o problema, muito obrigado @KXSY , eu fiquei até 2h da manhã resolvendo a questão do URI Online Judge. Sobre o link http:// https://www.freepascal.org/docs-html/rtl/system/sqrt.html ele continua aqui para mim, com erro.

 

 

 

02.jpg

adicionado 43 minutos depois

É o seguinte, realmente o que você falou sobre raiz quadrada não pode ser negativa, mas tive que ir passo a passo e testando. 

2 horas atrás, KXSY disse:

Se me lembro bem também logaritmos não tem negativo (ou em química eles tem, não lembro mesmo), geralmente esse tipo de função é você mesmo que tem que fazer, porque a biblioteca padrão não da suporte para fazer com números negativos.

O link aqui está ok.

 

Fiz da seguinte forma como exercício é a distancia entre dois pontos, coloquei mais duas variáveis p1 / p2. Passo a passo (Lembrando 3º Exemplo - Ponto 1 (p1) -> x1 = 2.5 / y1 = -0.4 e Ponto 2 (p2) -> x2 =  -12.2 / y2 = 7.0.

  • 1ª Substração
	p1 := (x2-x1);
	p2 := (y2-y1);
  • 2º Fazer a Potenciação (Aqui foi o erro)  estava colocando exp(y*ln(x)), como você tinha falado o (ln) não pode se x é negativo mas não tinha lembrado, matamos a charada kkkkkk, realmente não pode. Em anexo o do site GDB Online e do Pascalzim.
exp(2*ln(x2-x1))
exp(2*ln(y2-y1))

03.thumb.jpg.a29dbf8b76efb0ceba4d760d901e43d0.jpg

 

04.thumb.jpg.532f2e903913c777648fbd1468faf0e2.jpg

 

05.thumb.jpg.dabb59860216e7bc39e10cb2c4f1faa1.jpg

 

 

Agora sabendo da existência onde começava o erro, tirei a função (Exp). Fiz assim:

 

	p1 := abs(p1*p1);
	p2 := abs(p2*p2);

com a função (Abs), claro a multiplicação duas vezes tanto no ponto 1 e ponto 2, foi resolvido, pois lembrando o valor que de ponto 1 ou ponto 2 fosse negativo, retornaria com a função (Abs) o valor absoluto real (positivo).

  • Finalmente o último passo 3º a raiz quadrada, antes de tudo somando o dois pontos (p1 e p2).

Tenho dois códigos diferentes mas com a mesma resolução :

Program URI_1015 ;
var
	x1, x2, y1, y2, p1, p2, d : real ;
Begin
	readln (x1, y1);
	readln (x2, y2);
	p1 := (x2-x1);
	p2 := (y2-y1);
	writeln (p1);
	writeln (p2);
	writeln ('');
	p1 := abs(p1*p1);
	p2 := abs(p2*p2);
	writeln (p1);
	writeln (p2);
	writeln ('');
	d := sqrt(p1+p2);
	writeln (d);
End.

ou o mais curto:

Program URI_1015 ;
var
	x1, x2, y1, y2, d : real ;
Begin
	readln (x1, y1);
	readln (x2, y2);
	d := sqrt(abs((x2-x1)*(x2-x1))+abs((y2-y1)*(y2-y1))); 
	Writeln (d:0:4);  
End.

@KXSY Muito obrigado mesmo, estou muito feliz, até a próxima, abraços!

 

  • Amei 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

@Loops Infinity De nada

2 horas atrás, Loops Infinity disse:

Sobre o link http:// https://www.freepascal.org/docs-html/rtl/system/sqrt.html ele continua aqui para mim, com erro.

O nome do seu erro se chama Google Chrome, tem muitas paginas acadêmicas que ele simplesmente não abre (se você estiver usando net da vivo, ela tem o costume de bloquear também) por isso que eu desisti dele já faz tempo.

queria ter ajudado mais com a parte da matemática mas eu estou muito enferrujado, eu acho que para fazer isso aí você usou o teorema de pitágoras? (qualquer coisa em geometria usa isso kkk)

há uma ultima pergunta tá em qual do rank?

16 horas atrás, Loops Infinity disse:

URI Online Judge

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@KXSY 🤣😂🤣😂 não minha internet é NET, não é perfeita,mas aqui na minha região é a "melhorzinha". Sim também utiliza o teorema de pitágoras, falando em matemática também estou enferrujado, vou vê se consigo um tempo para estudar novamente algumas partes da matemática que deixei passar em branco. No URI Online Judge - Posição: 96.859º comecei agora no mês de fevereiro, estava praticando no Visualg antes e agora estou colocando em sintaxe Pascal lá na ferramenta, futuramente quero aprender outras linguagens também, você também possui uma conta lá, qual rank você está?  

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

35 minutos atrás, Loops Infinity disse:

não minha internet é NET, não é perfeita,mas aqui na minha região é a "melhorzinha".

Tá melhor que a minha, aqui e velox.

 

36 minutos atrás, Loops Infinity disse:

No URI Online Judge - Posição: 96.859º comecei agora no mês de fevereiro,

To no rank 0 (nem sabia que esse rank existia) comecei a programar há uns dois anos por hobby, achei um joguinho na internet de programação e acabei me interessando sobre o assunto, comecei com pascal mas passei uma raiva, porque eu estava programando um rpg e parei por um seis meses de programar e quando voltei já não sabia mais nada que estava lá. por isso dei um tchau para o pascal e comecei de novo em C.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

Olá a todos. Só complementando:

 

Na verdade não é propriamente um número negativo lá no sqrt(), está sim efetuando uma operação com um NaN, ou seja: o problema em si não está no cálculo da raiz, mas sim no cálculo do logaritmo... Lá sim que não poderia utilizar números negativos... ele retorna o tal do NaN...que por sua vez o Exp() vai retornam um NaN também... já a raiz dá pau.

 

Poderia fazer assim:

program URI_1015 ;
var
   x1, x2, y1, y2, d : real ;
begin
readln(x1, y1);
readln(x2, y2);
d := sqrt( exp(2*ln(abs(x2-x1))) + exp(2*ln(abs(y2-y1))) );
writeln (d:0:4);  
end.

 

Pois essa subtração, exemplo, x2-x1, é para encontrar a "distância entre os pontos", ou seja, será sempre positivo (não existe distância negativa)... no caso, como resultado dessa subtração vai ser elevada ao quadrado, não se faz necessário utilizar o módulo na fórmula geral. Entende? a grosso modo a fórmula deveria ser assim:

 

CodeCogsEqn.gif

 

Perceba também que a "ordem dos tratores não alteram o viaduto", ou seja: tanto faz x2-x1, quanto x1-x2... iria dar no mesmo (nessa ou na fórmula original).

 

 

@Loops Infinity, sobre:

 

Em 31/05/2019 às 16:39, Loops Infinity disse:

Agora sabendo da existência onde começava o erro, tirei a função (Exp). Fiz assim:


	p1 := abs(p1*p1);
	p2 := abs(p2*p2);

com a função (Abs), claro a multiplicação duas vezes tanto no ponto 1 e ponto 2, foi resolvido, pois lembrando o valor que de ponto 1 ou ponto 2 fosse negativo, retornaria com a função (Abs) o valor absoluto real (positivo).

 

Aqui temos alguns probleminhas nas justificativas e também nas correções (apenas detalhes):

  1. como já citado, o problema está no ln(), e não no exp() ou ná sqrt(). Uma justificativa mais correta seria algo como: "removi o cálculo de potência pela fórmula exp(y*ln(x)), pois as vezes o x dá negativo, e o Pascal não sabe calcular logaritmos para este tipo de número";
  2. como você mesmo já fez, uma outra forma de calcular uma potência, no caso de número ao quadrado, é multiplicando ele por ele mesmo... desta forma, o resultado sempre será não negativo¹ ("positivo"), logo não precisando do abs();

1 - todo número real vezes ele mesmo resultará em um número não negativo.

 

Logo, a resposta seria algo assim:

program URI_1015;
var
   x1, x2, y1, y2, d : real;
begin
readln(x1, y1);
readln(x2, y2);
d := sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
writeln(d:0:4);
end.

 

No aguardo.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Muito Obrigado @Simon Viegas, pela complementação, devido a faculdade e semana de provas, só tive tempo agora de visualizar sua resposta com mais tranquilidade, gostei da sua colocação, realmente o início seria isso aqui.

Em 03/06/2019 às 13:09, Simon Viegas disse:

o problema em si não está no cálculo da raiz, mas sim no cálculo do logaritmo...

 

Boa noite @Simon Viegas, até a próxima, abraços!

 

Obs: não sei como funciona o fechamento do tópico, se alguém puder fazer isso, o problema foi resolvido juntos com meu amigo @KXSY@Simon Viegas

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!