素数发生器突然停在16777213

时间:2016-05-23 05:26:01

标签: c++ primes

我做了一个小的c ++程序来检查素数。它似乎工作得很好,但过了一段时间它会停止到达16777213.谁能告诉我为什么?这是我的计划:

#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i <= sqrt(n); i++) {
        float div = n/float(i);
        if (!(div-floorf(div))) return false;
    }
    return true;
};

int main() {
    for(int a = 1; a < 18446744073709551614; a++ )
        if (isPrime(a))
            cout << a << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:4)

您的程序会停止打印素数,因为floorf会返回24位精确值。因此对于2 24 以上的任何素数[或非素数],计算div - floorf(div)将返回零值[因为两个值的尾数值总是“相同” - 有尾数中的小数部分没有空间] - &gt;你的函数返回false关于数字是否为素数。

即使您转到double,您也会遇到同样的问题。

使用整数数学运算,并使用%运算符确定它是否均匀分配。

正如评论中提到的,您的代码还有其他一些问题。也要解决这些问题......

编辑:为了澄清,您的程序继续尝试以计算素数。它只是发现所有这些都是“非素数”,因为float缺乏精确性,一旦达到精度极限就会产生“无差异”。