Eu estou elaborando um aplicativo de cálculos de probabilidades discretas mais importantes (irão ser seis no total, três finalizadas). Eu preciso que a saída me dê resultados com algarismos grandes para análise. Mas está havendo um problema. Quando passamos números grandes o programa solta ‘infy’ ou ‘nan’. Ou seja, reporta que o resultado é infinito ou não numérico. Mesmo definindo que os tipos das variáveis e funções com ‘double’, ‘long double’, ‘unsigned’, o compilador avisa que a definição de ‘unsigned’ está inválida. Eu desconfio da limitação dos 16 bits do DOS.
Existe limitações na capacidade de armazenamento numérico quando a saída é efetuada pelo DOS ? Seria isso ? Quem quiser ver o código, me fala.
o sistema operacional em pouco tem haver com isso.
isso parece ser especifico do seu compilador e as opções que vc esta utilizando. a limitação do DOS é mais em função de quantidade de memoria que vc pode alocar ( os antigos usavam mutretas para ir alem dos 640 kb de RAM )
poste um trecho do seu codigo junto da mensagem de erro
vamos entender essa linha
pss = (pow(l, k)*pow(E,-1*(int l)))/(fact(k));
e a mensagem de erro:
In function 'int main()':
Line 89: error: call of overloaded 'pow(int&, int&)' is ambiguous
compilation terminated due to -Wfatal-errors.
existem duas chamadas para pow nessa linha:
pow(l, k)
e pow(E,-1*(int l))
E é uma macro, ele vai ser substituido pelo valor que vc especificou la no começo
vamos agora ver a definição de pow:
https://en.cppreference.com/w/cpp/numeric/math/pow
no começo do seu programa vc fez using namespace std;
então (salvo engano) vc usa a std::pow
dito isso, o seu problema provavelmente é chamar a função com argumentos que o compilador julga não serem adequados.
eu fui tentar compilar o codigo com o gcc
$ g++ -Wall a.cpp
a.cpp: In function ‘int main()’:
a.cpp:89:29: error: expected primary-expression before ‘int’
pss = (pow(l, k)*pow(E,-1*(int l)))/(fact(k));
^
a.cpp:89:29: error: expected ‘)’ before ‘int’
a.cpp:89:47: error: expected ‘)’ before ‘;’ token
pss = (pow(l, k)*pow(E,-1*(int l)))/(fact(k));
^
a.cpp:70:7: warning: unused variable ‘k’ [-Wunused-variable]
float k, pss, acumula1;
^
Quais problemas ele encontra:
-
pow(E, -1 *(int l))
não faz muito sentido. a variavell
ja é inteira, por que vc faria um cast para inteiro? e o cast esta errado, vc deveria fazer assim:(int) l
, portanto vamos reescrever
pow(E, -1 *(int) l)
, removendo o cast: pow(E, -1 * l)
, removendo a multiplicação: pow(E, - l)
e agora a magica: exp( -l )
, vamos usar a função exponencial, sem precisar de macros.
https://en.cppreference.com/w/cpp/numeric/math/exp
- segundo: vc tem um parentesis a mais no final da expressão da linha 89.
vamos escrever a expressão final:
pss = (pow(l, k)*exp(-l))/fact(k);
se vc tentar compilar, vai funcionar. agora vamos ver os outros problemas:
$ g++ -Wall a.cpp
a.cpp: In function ‘int main()’:
a.cpp:70:7: warning: unused variable ‘k’ [-Wunused-variable]
float k, pss, acumula1;
^
a.cpp:245:45: warning: ‘difnx’ may be used uninitialized in this function [-Wmaybe-uninitialized]
H = hipergeo(NN, KK, nn, difNK, difnx, x1);
^
vc tem uma variavel q vc não usa ( k ) e isso não é um problema.
mas vc não fornece nenhum valor para difnx e isso provavelmente vai te trazer alguns problemas.
warnings não são erros, mas se vc não domina a linguagem é bom vc investigar todos. eles podem esconder possiveis problemas.
Eu defini “difnx = nn-x1” na minha função. (nas linhas finais) sendo que “nn” é a entrada e x1 é o contador variando 1,2,3,4,5… etc.
Não é pra mim q vc precisa explicar isso, é para o compilador.
se vc define essa variavel como parametro da sua função, mas dentro da função vc faz
difnx = (nn - x1 )
então vc não precisa de um parametro. isso é uma variavel local. qq valor passado vai ser ignorado uma vez q vc define la na linha 301