[英]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$
声明:错误发生在prime_func中。 我相信原因是模数(%符号)。
问题:为什么我得到浮点异常以及如何修复它?
发生的是零除。 您只初始化primes_pf
的前三个条目,但迭代所有这些条目(实际上,您的循环甚至超过最后一个条目的一个;使用i < 100
而不是i <= 100
来修复此问题)。 对于除前三个条目以外的所有条目,您除以一些单位化数量,其中一个条目显然恰好为零。 不要使用单位化值。
“浮点异常”用词不当。 它只发生在整数除以零和一些其他与除法相关的操作上。
不确定我是否相信上面的答案!
X = 5.0; Y = 0.0; Z = X / Y;
这将给出浮点异常....
问题似乎是prime_pf仅针对3个元素进行初始化。 所以模数试图除以零。 顺便说一句,如果你在你的printf语句中添加\\ n,并添加额外的语句fflush(stdout); 在程序错误之前,您更有可能看到调试输出。
primes_pf
变量中存在问题。 你似乎已经初始化此整数数组的前三个元素,但是当迭代i
超出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
我非常肯定这个!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.