C编程 – 浮点exception

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$ 

声明:错误发生在prime_func中。 我相信原因是模数(%符号)。

问题:为什么我得到浮点exception以及如何解决它?

发生的是零除。 你只初始化primes_pf的前三个条目,但迭代它们(实际上,你的循环甚至超过最后一个条目的一个;使用i < 100而不是i <= 100来解决这个问题)。 对于除前三个条目之外的所有条目,您除以一些单位数量,其中一个条目显然恰好为零。 不要使用单位化值。

“浮点exception”用词不当。 它只发生在整数除以零和其他几个与除法相关的操作上。

不确定我是否相信上面的答案!

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

这将给出一个浮点exception….

问题似乎是prime_pf仅针对3个元素进行初始化。 所以模数试图除以零。 顺便说一句,如果你在你的printf语句中添加\ n,并添加额外的语句fflush(stdout); 在程序错误之前,您更有可能看到调试输出。

primes_pf变量中存在问题。 你似乎初始化了这个整数数组的前三个元素,但是当迭代器超过2时, primes_pf[i]从未初始化的内存读取并与sq_root_pf进行比较; 这不可能是对的。

我没有花时间完全理解你的算法,但我最好的猜测是你忘记在for循环中的某个地方为primes_pf分配一个新值。

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

转为双(双)n_prmfnc

非常肯定这个!