简体   繁体   中英

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_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$ 

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 !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM