Pagina 1 di 1

[C][Risolto]Floating point exception

Inviato: mercoledì 11 maggio 2016, 15:56
da Gionatha
Salve,
come da titolo,mi sono imbattuto in quest'errore mentra calcolavo in una funzione la media di diversi elementi,approssimata sotto.
La funzione incriminata e' questa :

Codice: Seleziona tutto


int calcolamedia(int somma,int N)
{
	double x=(somma/N);
	int res=(int)floor(x);
	
	return res;
}

int main()
{
	int N,key;
	int somma=0;
	int media;
	elem *head=NULL,*curr=NULL;
	
	scanf("%d",&N);
	
	scanf("%d",&key);
	head=crealista(key);
	N--;
	somma += key;
	
	curr=head;
	while(N > 0)
	{
		scanf("%d",&key);
		curr=inserisci(curr,key);
		N--;
		somma+=key;
	}
	
	media=calcolamedia(somma,N);
	
	printf("%d\n",media);
Non posto tutto il codice,in quanto non mi sembra utile al fine dell'individuazione del problema.Qualcuno che mi da' una mano a capire cosa sbaglio? Cheers :birra:

Re: [C]Floating point exception

Inviato: mercoledì 11 maggio 2016, 16:42
da ubuntumate
Io farei così @Gionatha:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>

typedef enum {FALSE, TRUE} boolean_t;

typedef struct
{
        double result;
        unsigned int count;
        unsigned int sum;
}
stats;

static boolean_t get_average(stats *data);

int main(void)
{
        stats st = {0.0,10,100};
        boolean_t success;
        
        success = get_average(&st);
        if(FALSE == success)
        {
                return EXIT_FAILURE;
        }
        printf("Media: %.2lf\n",st.result);
        return EXIT_SUCCESS;
}

static boolean_t get_average(stats *data)
{
        if(NULL == data)
        {
                return FALSE;
        }
        if(0 == data->count)
        {
                return FALSE;
        }
        
        data->result = (double) (data->sum / data->count);
        return TRUE;
}
Aggiungerei solo qualche printf e qualche fgets+strtol.

Re: [C]Floating point exception

Inviato: mercoledì 11 maggio 2016, 17:45
da ixamit
E' un'impossibile rappresentazione del numero in virgola mobile come per esempio una divisione per zero.
ubuntumate ha aggiunto questo controllo:

Codice: Seleziona tutto

        if(0 == data->count)
        {
                return FALSE;
        }
ma attenzione al cast sulla divisione, entrambi i codici mi sembrano incorretti

Re: [C]Floating point exception

Inviato: mercoledì 11 maggio 2016, 18:10
da ubuntumate
Hai ragione ixamit. Bisognerebbe fare il cast direttamente su dividendo e/o divisore , altrimenti viene eseguita la divisione intera. Ho fatto di fretta che ero in ritardo per la lezione di sistemi.

Re: [C]Floating point exception

Inviato: mercoledì 11 maggio 2016, 18:15
da Gionatha

Codice: Seleziona tutto

./CancellazioneLista 
5 //numero elementi
1
2
3
4
5
Floating point exception (core dumped)
Anche inserendo un input del genere,ottengo errore.Non mi sembra ci siano divisioni per 0.

Re: [C]Floating point exception

Inviato: mercoledì 11 maggio 2016, 21:43
da Gionatha
Risolto,decrementavo N nel while fin quando non diventava 0 e poi lo passavo alla funzione,e li' dava errore.

Re: [C][Risolto]Floating point exception

Inviato: mercoledì 11 maggio 2016, 22:15
da ubuntumate
Prima ho scritto una boiata con i cast, ma il controllo sulla divisione andrebbe messo @Gionatha. Comunque bene che hai risolto.