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;
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);
}
при компиляции с:
$ gcc -Wall -g 3.c -o 3 -lm
Я получаю "исключение с плавающей запятой" при запуске результирующего исполняемого файла. В коде нет чисел с плавающей запятой. Что здесь не так, и что мне нужно сделать, чтобы решить проблему?
2 ответа
Решение
Деление на 0 считается "исключением с плавающей запятой". Не спрашивай меня почему.
Вы делите на 0 по крайней мере в двух местах. Обратите внимание, что оператор по модулю %
считается разделением.
На первой итерации цикла i
0, так bignum % i
деление на 0, что вызывает исключение с плавающей запятой. То же самое происходит с j
в вашем внутреннем цикле.
Поскольку вы проверяете на простоту, деление на 0 или на 1 не имеет смысла, поэтому начните с 2. Кроме того, вы должны остановиться на sqrt(bignum)
,
uint64_t limit = sqrt(bignum);
for (i = 2; i < limit; i++) {
...
for (j = 2; j < i; j++) {