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++) {