Estouro de valores! [RESOLVIDO]

1. Estouro de valores! [RESOLVIDO]

Edson Fernando Fumachi
eff666

(usa Debian)

Enviado em 16/10/2014 - 17:17h

Pessoal, blz?

Abaixo segue meu código funcionando.
O problema começa quando faço meu vetor T (float) virar uma matriz pois estou simulando o perfil de temperatura de um experimento que é função do raio (r[k]) e do z (ainda não implementado, mas nesse código podemos verificar o valor de z=0.0 na função C[k]).
Eu preciso fazer com que T vire uma matriz, mas quando faço isso e a defino como FLOAT, DOUBLE ou LONG DOUBLE, os resultados aparecem enormes, infinitos, eles estouram a precisão(?).
O mesmo acontece com a matriz lambda; se eu a deixa-la como double ou float, o mesmo erro acontece.
Criei as funções A[k], B[k] e C[k] para fazer um arredondamento prévio e depois arredondar novamente no cálculo de T[k].

Alguém tem alguma idéia de como proceder?

Att,

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define lim 10

int main(){
/*Essa matriz contém os zeros das funções de Bessel Jn.
lambda[i][0]: Autovalores de J0(lambda)
lambda[i][1]: Autovalores de J1(lambda) */
long double lambda[20][2]={
{2.404825,},
{5.520078,},
{8.653727,},
{11.79153,},
{14.93091,},
{18.07106,},
{21.21163,},
{24.35247,},
{27.49347,},
{30.63460,},
{33.77582,},
{36.91709,},
{40.05842,},
{43.19979,},
{46.34118,},
{49.48260,},
{52.62405,},
{55.76551,},
{58.90698,},
{62.04846,},
};
//-----------------------------FIM-----------------------
int i,j,k;
float a;
float r[lim],z[lim];
float T[lim];
float A[lim],B[lim],C[lim];
//----FIM das variáveis
a=0;
for(k = 0 ; k <= lim ; k++){
r[k]=a;
a+=.1;
}

for(k = 0 ; k <= lim ; k++){
for (i = 0 ; i < 20 ; i++){
A[k]=j0(lambda[i][0]*r[k]);
B[k]=(lambda[i][0]*j1(lambda[i][0]));
C[k]=exp(-lambda[i][0]*0.0);
T[k]+=(2*A[k]/B[k])*C[k];
}
printf("%10.9f\n",T[k]);
}
return 0;
}



  


2. Re: Estouro de valores! [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 16/10/2014 - 18:02h

Amigo , seu vetor long double é de 40 "valores" ([20][2]) , mas vc esta usando apenas 20.

Nao entendi direito o seu problema , qual seria ?

[]'s

T+


3. Re: Estouro de valores! [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 16/10/2014 - 19:50h

Também não entendi. Como quer transformar um vetor em matriz? Seriam necessários dois vetores. Explique melhor, sem arrodeios.


4. Re: Estouro de valores! [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2014 - 22:35h

Caro eff666,

Você poderia editar sua postagem original, a fim de colocar seu código entre as tags [code] e [/code], para facilitar a leitura?

Acho um tanto curioso que você declare os elementos de lambda como long double, embora defina para eles valores com tão pouca precisão. Dos zeros de J1, então, que você deixou totalmente zerados, nem se fale... ;)

Um problema bem visível do seu programa é que você declara r, z, T, A, B e C como vetores de lim elementos, mas faz acesso a lim+1 elementos em cada um deles (lembrando que, em C e C++, índices de arrays começam em zero, logo um vetor com n elementos só admite índices de 0 a n-1). C e C++, por uma questão de eficiência, não verificam os índices de um array: se você extrapolar usar um índice negativo ou maior ou igual ao tamanho declarado, vai invadir a área de outra variável ou provocar outro tipo de erro impredizível. É fundamental você corrigir esse erro.

Outra coisa curiosa: -lambda[i][0]*0.0 vai sempre valer zero, exceto quando lambda[i][0] valer +/-infinito ou NaN, quando o produto passa a valer NaN. Tem certeza de que é isso mesmo que você quis dizer?


5. Re: Estouro de valores! [RESOLVIDO]

Edson Fernando Fumachi
eff666

(usa Debian)

Enviado em 18/10/2014 - 09:09h

Pessoal,

Podem marcar como resolvido pois o que eu tinha q fazer era inicializar as variáveis com valores iguais a zero.

Abs


6. Re: Estouro de valores! [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 18/10/2014 - 09:15h

eff666 escreveu:

Pessoal,

Podem marcar como resolvido pois o que eu tinha q fazer era inicializar as variáveis com valores iguais a zero.

Abs


Amigo, é voce quem marca o topico como resolvido , clique no botao "Marcar topico como resolvido" e depois escolha a respota que mais lhe ajudou

Espero ter ajudado

[]'s

T+


7. Re: Estouro de valores! [RESOLVIDO]

Edson Fernando Fumachi
eff666

(usa Debian)

Enviado em 18/10/2014 - 09:15h

paulo1205 escreveu:

Caro eff666,

Você poderia editar sua postagem original, a fim de colocar seu código entre as tags [code] e [/code], para facilitar a leitura?

Acho um tanto curioso que você declare os elementos de lambda[/b] como long double, embora defina para eles valores com tão pouca precisão. Dos zeros de J1, então, que você deixou totalmente zerados, nem se fale... ;)

Um problema bem visível do seu programa é que você declara [i]r
, z, T, A, B e C como vetores de lim elementos, mas faz acesso a lim+1 elementos em cada um deles (lembrando que, em C e C++, índices de arrays começam em zero, logo um vetor com n elementos só admite índices de 0 a n-1). C e C++, por uma questão de eficiência, não verificam os índices de um array: se você extrapolar usar um índice negativo ou maior ou igual ao tamanho declarado, vai invadir a área de outra variável ou provocar outro tipo de erro impredizível. É fundamental você corrigir esse erro.

Outra coisa curiosa: -lambda[i][0]*0.0 vai sempre valer zero, exceto quando lambda[i][0] valer +/-infinito ou NaN, quando o produto passa a valer NaN. Tem certeza de que é isso mesmo que você quis dizer?


Olá,

Realmente, em relação ao tamanho dos vetores, acabei arrumando, ou seja, o programa ao acessar a memoria não acessara aquela que não seja a correspondente.

Lambda*0.0 foi propositado, pois os valores de z, entrarão no lugar do 0.0.

Vlw pela ajuda







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts