C &引用;“浮点异常”;在不包含浮点数的代码中
在此代码中:C &引用;“浮点异常”;在不包含浮点数的代码中,c,C,在此代码中: #include <stdlib.h> #include <stdio.h> #include <stdint.h> int main (int argc, char ** argv) { uint64_t bignum = 600851475143; int is_prime = 0; uint64_t result = 0; uint64_t i = 0; uint64_t j = 0; f
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
int main (int argc, char ** argv) {
uint64_t bignum = 600851475143;
int is_prime = 0;
uint64_t result = 0;
uint64_t i = 0;
uint64_t j = 0;
for (i = 0; i < bignum; i++) {
if (bignum % i == 0) {
is_prime = 1;
for (j = 0; j < i; j++) {
if (i % j == 0) {
is_prime = 0;
break;
}
}
if (is_prime) {
result = i;
}
}
}
printf("The largest prime factor of the number %lu is %lu.\n", bignum, result);
}
在运行生成的可执行文件时,我得到一个“浮点异常”。代码中没有浮点数。这里出了什么问题,我需要做什么来解决问题?除以0被报告为“浮点异常”。别问我为什么
您至少在两个位置被0除。请注意,模运算符
%
算作除法 在循环的第一次迭代中,i
是0,因此bignum%i
是0的除法,这就是导致浮点异常的原因。内部循环中的j
也会发生同样的情况
由于您正在测试素性,所以除以0或1没有意义,所以从2开始。另外,您应该在sqrt(bignum)
处停止
uint64\u t limit=sqrt(bignum);
对于(i=2;i
此外,测试4、6、8等没有意义。对2进行测试,然后进行for循环:for(i=3;i
,有效地测试3、5、7、9等……有趣的是,浮点数通常不会导致此错误。@illdan4是的。被零除会导致float
s中的无穷大。
$ gcc -Wall -g 3.c -o 3 -lm
uint64_t limit = sqrt(bignum);
for (i = 2; i < limit; i++) {
...
for (j = 2; j < i; j++) {