C programming - floating point exception
matthewmpp@annrogers:~/Programming/C.progs/Personal$ cat prime4.c
/*
* File: main.c
* Author: matthewmpp
*
* Created on November 7, 2010, 2:16 PM
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
/*
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_fu开发者_运维技巧nc (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$
STATEMENT: the error is in the prime_func. I believe the cause is the modulus (% sign).
QUESTION: why am I getting the Floating Point Exception and how do I fix it?
What happens is a division by zero. You only initialise the first three entries of primes_pf
, but iterate over all of them (actually, your loop runs even one past the last entry; use i < 100
instead of i <= 100
to fix this). For all but the first three entries, you divide by some unitialised quantity, and one of the entries apparently happens to be zero. Don't use unitialised values.
"Floating point exception" is a misnomer. It only happens on integer division by zero and a few other division-related operations.
Not sure I believe the answer above!
X = 5.0; Y = 0.0; Z = X/Y;
This will give a floating point exception....
The problem would appear to be that prime_pf is only initialised for 3 elements. So the modulo is attempting to divide by zero. BTW, if you add \n to your printf statement, and add the extra statement fflush(stdout); you are more likely to see the debug output before the program errors.
The problem exists in your primes_pf
variable. You seemed to have initialized the first three elements of this integer array, but when iterator i
goes beyond 2, primes_pf[i]
is reading from uninitialized memory and getting compared to sq_root_pf
; that can't be right.
I haven't taken the time to fully understand your algorithm but my best guess is that you forgot to assign a new value to primes_pf
somewhere in your for loop.
sqrt(x) needs x to be of type double, you have used int.
Cast to double (double)n_prmfnc
I am VERY sure about this !
精彩评论