04/02/10 8:23
MagoAntò
Ciao a tutti!
Sono alle prese con un esercizio (anzi, una serie di esercizi) che mi richiedono, tra le altre cose, il calcolo dell'errore di round off. L'esercizio mi chiede di utilizzare una variabile double (nello specifico, double x)come risultato esatto e una variabile float (nello specifico, flx = (float)x) come sua approssimazione. Il calcolo dell'errore di round off viene, infine, eseguito calcolando l'errore relativo secondo questa formula: |x-flx|/|x|.
Vi riporto la traccia dell'esercizio:
Visualizzare l’errore di roundoff nei seguenti algoritmi. Scrivere una function C per calcolare una somma di molti addendi mediante l’algoritmo del raddoppiamento ricorsivo (batch adding - versione iterativa).
Diciamo che già la frase "raddoppiamento ricorsivo (versione iterativa)" già mi lascia un po' perplesso. Per raddoppiamento ricorsivo si intende una situazione del genere: abbiamo questi elementi
0 2 6 3 4 2
la somma totale, ovviamente, è 17 e la si deve ottenere con una funzione che somma prima 0+2 poi 6+3 poi 4+2, dopodichè somma i rispettivi risultati (2, 9, 6) facendo 2+9, il risultato +6 cioè 11+6 = 17
Ho deciso di implementare l'algoritmo ricorsivamente, in ogni caso. Questo è il codice:
Il codice mi da questi errori:
* warning C4244: '=' : conversion from 'int ' to 'float ', possible loss of data,
relativo alla riga "ultimo = size-1;"
* warning C4244: '=' : conversion from 'double ' to 'float ', possible loss of data,
relativo alla riga "errore_roundoff = fabs ((risultato_esatto-risultato)/risultato_esatto);"
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2110: cannot add two pointers,
relativo alla riga "return (a[primo] + a[ultimo])";
* warning C4033: 'somma_radd_ric' must return a value,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo])";
* error C2115: 'return' : incompatible types,
relativo alla riga "return (a[primo])";
Il problema è il seguente: la function sembra funzionare solo nel caso in cui i parametri di input e di output vengano dichiarati come int. Nel momento in cui cambio i tipi di dato, succede quello che ho elencato sopra. Avevo pensato di dichiarare l'array e il risultato esatto come campi di una union, in modo da condividere la stessa area di memoria. Qualche aiuto? E' molto importante! Grazie in anticipo a tutti
Sono alle prese con un esercizio (anzi, una serie di esercizi) che mi richiedono, tra le altre cose, il calcolo dell'errore di round off. L'esercizio mi chiede di utilizzare una variabile double (nello specifico, double x)come risultato esatto e una variabile float (nello specifico, flx = (float)x) come sua approssimazione. Il calcolo dell'errore di round off viene, infine, eseguito calcolando l'errore relativo secondo questa formula: |x-flx|/|x|.
Vi riporto la traccia dell'esercizio:
Visualizzare l’errore di roundoff nei seguenti algoritmi. Scrivere una function C per calcolare una somma di molti addendi mediante l’algoritmo del raddoppiamento ricorsivo (batch adding - versione iterativa).
Diciamo che già la frase "raddoppiamento ricorsivo (versione iterativa)" già mi lascia un po' perplesso. Per raddoppiamento ricorsivo si intende una situazione del genere: abbiamo questi elementi
0 2 6 3 4 2
la somma totale, ovviamente, è 17 e la si deve ottenere con una funzione che somma prima 0+2 poi 6+3 poi 4+2, dopodichè somma i rispettivi risultati (2, 9, 6) facendo 2+9, il risultato +6 cioè 11+6 = 17
Ho deciso di implementare l'algoritmo ricorsivamente, in ogni caso. Questo è il codice:
#include <stdio.h> #include <math.h> #include <float.h> float somma_radd_ric (float a [], float primo, float ultimo); void main () { float a [50]; float errore_roundoff, primo, ultimo, risultato; double risultato_esatto; int i, size; primo = 0; risultato_esatto = 0; printf ("Digita il numero degli addendi (max. 50): "); scanf ("%d", &size); ultimo = size-1; for (i=0; i<size; i++) { printf ("Inserisci il %d addendo: ", i+1); scanf ("%f", &a[i]); risultato_esatto = risultato_esatto + (double)a[i]; } risultato = somma_radd_ric (a, primo, ultimo); printf ("Il risultato e' = %f\n", risultato); errore_roundoff = fabs ((risultato_esatto-risultato)/risultato_esatto); printf ("L'errore di roundoff e' = %e\n", errore_roundoff); } float somma_radd_ric (float a [], float primo, float ultimo) { float mediano; if (ultimo - primo == 1) return (a[primo] + a[ultimo]); if (ultimo==primo) return (a[primo]); else { mediano = (primo+ultimo)/2; return (somma_radd_ric (a,primo,mediano) + somma_radd_ric (a,mediano+1,ultimo)); } }
Il codice mi da questi errori:
* warning C4244: '=' : conversion from 'int ' to 'float ', possible loss of data,
relativo alla riga "ultimo = size-1;"
* warning C4244: '=' : conversion from 'double ' to 'float ', possible loss of data,
relativo alla riga "errore_roundoff = fabs ((risultato_esatto-risultato)/risultato_esatto);"
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2110: cannot add two pointers,
relativo alla riga "return (a[primo] + a[ultimo])";
* warning C4033: 'somma_radd_ric' must return a value,
relativo alla riga "return (a[primo] + a[ultimo])";
* error C2108: subscript is not of integral type,
relativo alla riga "return (a[primo])";
* error C2115: 'return' : incompatible types,
relativo alla riga "return (a[primo])";
Il problema è il seguente: la function sembra funzionare solo nel caso in cui i parametri di input e di output vengano dichiarati come int. Nel momento in cui cambio i tipi di dato, succede quello che ho elencato sopra. Avevo pensato di dichiarare l'array e il risultato esatto come campi di una union, in modo da condividere la stessa area di memoria. Qualche aiuto? E' molto importante! Grazie in anticipo a tutti
Ultima modifica effettuata da MagoAntò 04/02/10 10:08
aaa