[C][Risolto]Floating point exception

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Gionatha
Prode Principiante
Messaggi: 155
Iscrizione: mercoledì 28 ottobre 2015, 23:02
Desktop: Gnome
Distribuzione: Ubuntu
Sesso: Maschile
Località: Pisa

[C][Risolto]Floating point exception

Messaggio 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:
Ultima modifica di Gionatha il mercoledì 11 maggio 2016, 21:43, modificato 1 volta in totale.
Computer science is no more about computers than astronomy is about telescopes
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C]Floating point exception

Messaggio 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.
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [C]Floating point exception

Messaggio 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
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C]Floating point exception

Messaggio 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.
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
Gionatha
Prode Principiante
Messaggi: 155
Iscrizione: mercoledì 28 ottobre 2015, 23:02
Desktop: Gnome
Distribuzione: Ubuntu
Sesso: Maschile
Località: Pisa

Re: [C]Floating point exception

Messaggio 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.
Computer science is no more about computers than astronomy is about telescopes
Avatar utente
Gionatha
Prode Principiante
Messaggi: 155
Iscrizione: mercoledì 28 ottobre 2015, 23:02
Desktop: Gnome
Distribuzione: Ubuntu
Sesso: Maschile
Località: Pisa

Re: [C]Floating point exception

Messaggio da Gionatha »

Risolto,decrementavo N nel while fin quando non diventava 0 e poi lo passavo alla funzione,e li' dava errore.
Computer science is no more about computers than astronomy is about telescopes
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][Risolto]Floating point exception

Messaggio da ubuntumate »

Prima ho scritto una boiata con i cast, ma il controllo sulla divisione andrebbe messo @Gionatha. Comunque bene che hai risolto.
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti