Derivate da C in C++ ?

Messaggioda Vincenzo98 » 11/02/2017, 14:03

Come trasformo questo codice da C in C++ ?

Questo programma scritto in C , calcola la derivata di una funzione in un punto scelto dall'utente .

Codice:
#include <stdio.h>
#include <math.h>
// Calcola la derivata di una funzione in un punto dato
float fnc(float x)
{
/*f(x)=x^2+cos(x)
Funzione di prova */
return powf(x,2)+cosf(x); //Immettere qui la funzione

}
void main()
{

float d,d1,x,x1;
int n;
d=0;
printf("Introdurre il valore del punto: ");
scanf("%f",&x1);
for(n=0;n<10;n++)
{
d1=d;
x=x1+powf(.5,n);
d=(fnc(x)-fnc(x1))/(x-x1);
}
printf("La derivata nel punto %f e pari a %f\n",x1,2*d-d1);
}


Grazie
Vincenzo98
New Member
New Member
 
Messaggio: 30 di 82
Iscritto il: 16/02/2014, 21:23

Re: Derivate da C in C++ ?

Messaggioda apatriarca » 13/02/2017, 00:22

Il C++ è retro compatibile con il C e quel codice è quindi del tutto valido anche in C++. In effetti, è più valido in C++ che in C. Il commento che inizia con // è stato infatti introdotto in C solo dopo che è diventato comune in C++. Lo stesso vale per la possibilità di omettere il return 0; alla fine del main. La stessa revisione dello standard ha introdotto la possibilità di dichiarare variabili ovunque nel codice e non solo all'inizio come hai fatto nel tuo codice.

Tuttavia non è un bel codice in nessuno dei due linguaggi. Vediamo un po' di ragioni:
1. Il ciclo che hai scritto non ha alcun senso di esistere. Memorizzi infatti semplicemente gli ultimi due valori del ciclo. Sarebbe molto più efficiente e leggibile scrivere qualcosa come:
Codice:
// siccome ho due valori uso x al posto del x1 per il valore letto da terminale
double x1 = x + 1.0/512.0;
double x2 = x + 1.0/1024.0;
double fx = fnc(x);
double d1 = (fnc(x1) - fx)/(x1 - x);
double d2 = (fnc(x2) - fx)/(x2 - x);
double d = 2*d2 - d1; // risultato che usi come derivata

2. Non c'è alcuna garanzia riguardo all'errore della derivata calcolata usando il tuo metodo. Dipende dalla funzione scelta. Il calcolo della derivata usando metodi simili è comunque necessariamente poco robusta. Sono infatti il genere di calcoli che portano ad errori di precisione. Per questa ragione sarebbe almeno opportuno usare double invece di float.
3. Siccome sia in C che in C++ è possibile dichiarare variabili in ogni punto delle funzioni, non ha molto senso farlo all'inizio della funzione.
4. Non c'è alcun vantaggio nell'uso di powf(x, 2) invece di usare x*x. E' anzi potenzialmente peggio da praticamente ogni punto di vista.
5. In C++ (e negli standard più recenti del C) hanno dato la possibilità di usare semplicemente pow e cos per tutti i tipi senza aver necessità di usare powf e cosf e senza che ci siano conversioni di tipi.
6. main deve restituire un int, non void! Questo vale sia per il C che per il C++. Nel caso del C non mi sembra tu possa omettere il return tra l'altro.. Alcuni compilatori lo permettono ma questo rende il tuo codice non del tutto corretto in base allo standard di nessuno dei due linguaggi.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4537 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite