Progtwigción en C – excepción de punto flotante

matthewmpp@annrogers:~/Programming/C.progs/Personal$ cat prime4.c /* * File: main.c * Author: matthewmpp * * Created on November 7, 2010, 2:16 PM */ #include  #include  #include  #include  /* prime numbers. version4 should tell whether a number is prime or not prime. by using other prime numbers. */ int input_func () { char line[100]; int n_input; while (1) { printf("Please enter a whole number.\n"); fgets(line, sizeof (line), stdin); sscanf(line, "%d", &n_input); if (n_input >= 0) break; return (n_input); } } int ifstatements_func (n_ifstate) int n_ifstate; { if (n_ifstate == 0) { printf("The number, %d, is not prime and has no factors.\n", n_ifstate); exit(1); } if (n_ifstate == 1) { printf("The number, %d, is not prime.\n", n_ifstate); printf("The factors of %d, is %d.\n", n_ifstate, n_ifstate); exit(1); } if (n_ifstate == 2) { printf("The number, %d, is a prime.\n", n_ifstate); printf("The factors of %d, are 1 and %d.\n", n_ifstate, n_ifstate); exit(1); } if (n_ifstate == 3) { printf("The number, %d, is a prime.\n", n_ifstate); printf("The factors of %d, are 1 and %d.\n", n_ifstate, n_ifstate); exit(1); } return (n_ifstate); } int square_root_func (n_prmfnc) int n_prmfnc; { int i; //counter float sq_root_f; int sq_root_i; int primes[100]; int length_primes; primes[0] = 2; /*first prime is 2.*/ primes[1] = 3; /*second prime is 3.*/ length_primes = sizeof (primes); //printf ("before.sq_root.value of n_prmfnc=%d\n", n_prmfnc); sq_root_f = sqrt(n_prmfnc); sq_root_i = sq_root_f; //printf ("prmfnc.after.sq_root\n"); //printf ("value of sq_root=%.3f\n", sq_root_f); //printf ("value of sq_root=%d\n", sq_root_i); return (sq_root_i); } int prime_func (sq_root_pf, n_pf) int sq_root_pf, n_pf; { int prime_counter; int prime_temp; int prime_flag=0; int primes_pf[100]; int i; //counter primes_pf[0]=2; primes_pf[1]=3; primes_pf[2]=5; printf ("before.for.in.pf"); for (i = 0; i <= 100; ++i) { printf ("after.for.in.pf"); if (primes_pf[i] <= sq_root_pf) { printf ("before.modulus.in.pf"); prime_temp = n_pf % primes_pf[i]; printf ("after.modulus.in.pf"); if (prime_temp == 0) { ++prime_counter; if (prime_counter == 0) prime_flag = 1; /*yes, number is prime.*/ } } } return (prime_flag); } int main() { int n_main1; //number from input int n_main2; //number after if statements int sq_root_main; //square root of number from function int prime_flag_main; //value of 1 if it is a prime n_main1 = input_func (); printf("main.after.input.function=%d.\n", n_main1); n_main2 = ifstatements_func (n_main1); printf ("main.after.ifstatments.function=%d\n", n_main2); sq_root_main = square_root_func (n_main2); printf ("main.after.square_root_func_func=%d\n", sq_root_main); prime_flag_main = prime_func (sq_root_main, n_main2); printf ("main.after.prime_func=%d\n", prime_flag_main); return (EXIT_SUCCESS); } OUTPUT: matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c prime4.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o prime4 prime4.c -lm matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./prime4 Please enter a whole number. 44 main.after.input.function=44. main.after.ifstatments.function=44 main.after.square_root_func_func=6 Floating point exception matthewmpp@annrogers:~/Programming/C.progs/Personal$ 

DECLARACIÓN: el error está en el prime_func. Creo que la causa es el módulo (signo%).

PREGUNTA: ¿por qué obtengo la excepción de punto flotante y cómo la arreglo?

Lo que pasa es una división por cero. Solo inicializa las tres primeras entradas de primes_pf , pero itera sobre todas ellas (en realidad, su bucle se ejecuta incluso una pasada la última entrada; use i < 100 lugar de i <= 100 para solucionar este problema). Para todas menos las tres primeras entradas, se divide por alguna cantidad unificada y, aparentemente, una de las entradas es cero. No utilice valores unitarios.

“Excepción de punto flotante” es un nombre inapropiado. Solo sucede en la división entera por cero y en algunas otras operaciones relacionadas con la división.

No estoy seguro de creer la respuesta anterior!

X = 5.0; Y = 0.0; Z = X / Y;

Esto dará una excepción de punto flotante …

El problema parece ser que prime_pf solo se inicializa para 3 elementos. Así que el módulo está intentando dividir por cero. Por cierto, si agrega \ n a su statement printf, y agrega la statement adicional fflush (stdout); es más probable que vea la salida de depuración antes de los errores del progtwig.

El problema existe en su variable primes_pf . Parecía que primes_pf[i] inicializado los primeros tres elementos de esta matriz de enteros, pero cuando el iterador i va más allá de 2, primes_pf[i] está leyendo desde la memoria no inicializada y se compara con sq_root_pf ; Eso no puede ser correcto.

No he tomado el tiempo para comprender completamente su algoritmo, pero mi mejor estimación es que se le olvidó asignar un nuevo valor a primes_pf en algún lugar de su ciclo for.

 sqrt(x) needs x to be of type double, you have used int. 

Reparto a doble (doble) n_prmfnc

Estoy muy seguro de esto!