Prompt DOS

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

https://t.co/5X3Wh6I1hP

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 variavel l 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.

1 curtida

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