Alle primissime armi

di il
7 risposte

Alle primissime armi

Buonasera, sto imparando i fondamenti della programmazione c++ per console.
Ho provato a scrivere un programmino per il calcolo della radice quadrata di un numero, ma non funzione. Mi aiutarte a capire dove sbaglio? Grazie..

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;


float k = 1.0, prodotto = 0.0, fattore = 0.1, des = 0.0; // des = valore di cui calcolare la radice;


int main(int argc, char **argv) {

cout << " Inserisci il valore: ";
cin >> des;

while (prodotto != des) {
k = k + fattore;
prodotto = k * k;
if (prodotto > des ) {
k = k - fattore;
fattore = fattore * 0.1;
}
}
cout << endl << "La radice quadrata di " << des << " e: " << k << endl;

return 0;
}

7 Risposte

  • Re: Alle primissime armi

    Funziona solo se la radice quadrata è un intero. Negli altri casi Il ciclo ripete all'infinito il ciclo while senza mai entrare nella condizione if. Non riesco però a vedere il motivo...
  • Re: Alle primissime armi

    Che vuoi dire?

    Se inserisci

    231.45

    non funziona?
  • Re: Alle primissime armi

    Se inserisco a console il valore 4 ottengo, giustamente, 2 come risultato.
    Se inserisco 5 non ottengo nulla a console. Facendo delle prove ho notato che il programma non entra neache nella funzione if (ho provato a mettere un cout < " xxx " all'interno della funzione if ma non viene stampato a display.
  • Re: Alle primissime armi

    Utilizza i

    double

    e non i float.

    E poi nella condizione della while difficilmente avrai una perfetta diseguaglianza, quindi adotterai un valore minimo (in assoluto) per decidere se terminare il ciclo

    while (fabs(prodotto-des)>0.000001) {
  • Re: Alle primissime armi

    Ok! facendo prove il programmino mi sembra funzionare bene mettendo sia double come tipo di dato che il valore minimo nella condizione del ciclo.

    Ho appena cominciato e interessarmi di programmazione (cmq i miei obiettiivi non sono professionali) e ho molta strada da fare!

    Grazie per l'aiuto!
  • Re: Alle primissime armi

    oregon ha scritto:


    ... difficilmente avrai una perfetta diseguaglianza ...
    Una perfetta diseguaglianza ??????

    Caso mai perfetta uguaglianza !

    Comunque oregon hai ragione: il problema relativo a comparare due numeri in virgola mobile non e' assolutamente banale.

    E' estremamente subdolo, e fonte inesauribile di problemi.

    Ci sono interi corsi universitari che si occupano dell'argomento

    Generalmente servono delle tecniche di programmazione dedicate, come quella indicata.

    Altra considerazione: usare i double al posto dei float, non elimina il problema, e nemmeno lo riduce: se con il float l'errore lo hai alla quinta cifra decimale, con il double all'ottava (o alla dodicesima, e' indifferente).
    Ma questo non cambia nulla quando tali valori sono coinvolti negli operatori di confronto
  • Re: Alle primissime armi

    migliorabile ha scritto:


    Una perfetta diseguaglianza ??????

    Caso mai perfetta uguaglianza !
    Non avevo dubbi che avresti fatto la tua puntuale e stucchevole precisazione ...
Devi accedere o registrarti per scrivere nel forum
7 risposte