Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    4

    [C] problema con sqrt

    ciao a tutti, sto cercando di imparare a programmare in c, ho scritto un programma che dati i valori di a,b,c stampa il tipo di equazione e i risultati.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    int a;
    int b;
    int c;
    int d2;
    double d3;
    double x;
    double y;
    double y2;
    //risoluzioni espressioni di primo e secondo grado
    printf("inserisci il valore di a \n");
    scanf("%d", &a);
    printf("inserisci il valore di b \n");
    scanf("%d", &b);
    printf("inserisci il valore di c \n");
    scanf("%d", &c);
    			printf("l'espressione inserita e': %d", a);
    			printf("x^2 + %d", b);
    			printf("x + %d", c);
    			printf("=0 \n");
    
    switch (a) {
    case 0:
    printf("l'equazione e' di 1^ grado \n");
    x=(c*-1);
    y=x/b;
    printf("x=%f\n", y);
    break;
    default:
    printf("l'equazione e' di secondo grado \n");
       switch (b) {
       case 0:
       printf("si tratta di un equazione pura \n");
       x=(c*-1);
    39---   y=sqrt(x/a);
       printf("i risultati sono: x1=%f", -y);
       printf("; x2=%f\n", y);
       break;
       default:
       	  	switch (c) {
             case 0:
             printf("si tratta di un' equazione spuria \n");
             x=(b*-1);
             y=(x/a);
             printf("i risultati sono: x1=0; x2=%f \n", y);
             break;
             default:
             d2=(b*b-4*a*c);
    53---         d3=sqrt(d2);
             printf("d: %f", d3);
             y=(-b-d3)/2*a;
             printf("%f -b", -b);
             printf("%f y:", y);
             y2=(-b+d3)/2*a;
             printf("i risultati dell'equazione sono: x1=%f", y);
             printf("; x2=%f\n", y2);
             break;
             }
       break;
       }
    break;
    }
    
    fflush(stdin);
    system("pause");
    return 0;
    }
    il programma funzione, ma nelle righe 39 e 53

    codice:
    switch (b) {
          case 0:
          printf("si tratta di un equazione pura \n");
          x=(c*-1);
          y=sqrt(x/a);
          printf("i risultati sono: x1=%f", -y);
          printf("; x2=%f\n", y);
          break;
    codice:
    default:
             d2=(b*b-4*a*c);
             d3=sqrt(d2);
             printf("d: %f", d3);
             y=(-b-d3)/2*a;
             printf("%f -b", -b);
             printf("%f y:", y);
             y2=(-b+d3)/2*a;
             printf("i risultati dell'equazione sono: x1=%f", y);
             printf("; x2=%f\n", y2);
             break;
    il programma sbaglia a calcolare la radice. inoltre ho dovuto dividere tutti i calcoli altrimenti i risultati erano completamente sbagliati.

    codice:
    x=(c*-1);
    y=x/b;
    printf("x=%f\n", y);
    !=
    codice:
    x=(c*-1)/b;
    printf("x=%f\n", x);
    suggerimenti?

  2. #2
    dal momento che gli operandi (b e c) sono di tipo int, nella versione "corta" dell'operazione il risultato sarà uguale a quello degli operandi, perdendo così di precisione.
    il problema non si presenta nella versione estesa perchè, prima della divisione, il risultato di (c*-1) viene convertito automaticamente (nell'assegnazione ad x) in un double e reso quindi pienamente compatibile per la successiva divisione.
    le due possibili soluzioni sono:
    - cast esplicito
    codice:
    	x=(double) (c*-1)/b;
    - cast implicito
    codice:
    	x=(c*-1)/(b*1.0);

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    4
    il primo metodo l'avevo già provato ma il risultato era sbagliato, ma non stò parlando di errori di approsimazioni: sqrt(400)=36500; sqrt(4)=4 || = 0;

    sono risultati impossibili...

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Se hai questi errori, la FPU avra' generato un errore che non gestisci (vedo solo divisioni), hai la gestione abilitata?
    Cmq la vedo strano perche le librerie standard dovrebbero resettare la FPU, se non ricordo male.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C] problema con sqrt

    Originariamente inviato da as91

    codice:
    x=(c*-1)/b;
    printf("x=%f\n", x);
    suggerimenti?
    Questo suggerimento

    codice:
    x=(c*-1)/(double)b;
    printf("x=%f\n", x);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Anche includere math.h non sarebbe male comunque.
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    4
    Questo suggerimento

    codice:
    x=(c*-1)/(double)b;
    printf("x=%f\n", x);
    codice:
    
    
    potrebbe risolvere anche il problema della radice? perchè ho provato a fare un programma semplice

    codice:
    double a=4;
    double b=sqrt(a);
    printf("%f", b);
    Originariamente inviato da YuYevon
    Anche includere math.h non sarebbe male comunque.
    io uso borland e a volte non lo capisco, pensa che in questo programma faceva funzionere sytem("pause"); senza <stdlib.h>

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cosa ti succede con questo codice?

    codice:
    double a=4;
    double b=sqrt(a);
    printf("%f", b);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Anchio sto imparando, ho sentito che c'è un header chiamato <math.h>, potrebbe aiuterti?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Come ha già scritto YuYevon, si presuppone che l'include math.h sia usato ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.