Программирование на C - исключение с плавающей запятой - PullRequest
3 голосов
/ 08 ноября 2010
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$ 

ЗАЯВЛЕНИЕ: ошибка в prime_func. Я считаю, что причиной является модуль (знак%).

ВОПРОС: почему я получаю исключение с плавающей запятой и как его исправить?

Ответы [ 5 ]

12 голосов
/ 08 ноября 2010

Что происходит, это деление на ноль. Вы инициализируете только первые три записи primes_pf, но выполняете итерации по всем из них (фактически, ваш цикл выполняется даже после последней записи; используйте i < 100 вместо i <= 100, чтобы исправить это). Для всех, кроме первых трех записей, вы делите на некое единичное количество, и одна из записей, по-видимому, равна нулю. Не используйте унифицированные значения.

7 голосов
/ 08 ноября 2010

«Исключение с плавающей запятой» является неправильным. Это происходит только при integer делении на ноль и нескольких других операциях, связанных с делением.

0 голосов
/ 05 марта 2016
sqrt(x) needs x to be of type double, you have used int.

приведение к удвоению (двойной) n_prmfnc

Я ОЧЕНЬ уверен в этом!

0 голосов
/ 08 ноября 2010

Проблема существует в вашей переменной primes_pf. Вы, казалось, инициализировали первые три элемента этого целочисленного массива, но когда итератор i выходит за пределы 2, primes_pf[i] читает из неинициализированной памяти и сравнивается с sq_root_pf; это не может быть правдой.

Я не потратил время на полное понимание вашего алгоритма, но, скорее всего, вы забыли назначить новое значение для primes_pf где-то в цикле for.

0 голосов
/ 08 ноября 2010

Не уверен, что верю ответу выше!

Х = 5,0; Y = 0,0; Z = X / Y;

Это даст исключение с плавающей запятой ....

Проблема может заключаться в том, что prime_pf инициализируется только для 3 элементов. Таким образом, по модулю пытается делить на ноль. Кстати, если вы добавите \ n в свой оператор printf и добавите дополнительный оператор fflush (стандартный вывод); вы скорее всего увидите выходные данные отладки до ошибок программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...