c++ - 素数生成器突然停止在 16777213

标签 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;
}

最佳答案

您的程序停止打印素数,因为 floorf 返回 24 位精确值。因此,对于大于 224 的任何素数 [或非素数],计算 div - floorf(div) 将返回零值 [因为尾数值始终为“the两个值相同” - 尾数中的小数部分没有空格] -> 你的函数返回 false 关于数字是否为素数。

即使您移动到double,您也会遇到同样的问题,只是更进一步。

使用整数数学,并使用 % 运算符来确定它是否均匀除法。

如评论所述,您的代码还有其他一些问题。也要解决这些问题......

编辑:澄清一下,您的程序继续尝试计算质数。由于 float 中缺乏精度,它只是发现所有这些都“不是质数”,一旦达到精度极限,就会导致“无差异”。

关于c++ - 素数生成器突然停止在 16777213,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37383161/

相关文章:

c++ - 堆内存为何产生?

c++ - 使用 qt 在 SQLITE 数据库中插入多行

java - 质数问题

algorithm - 小数字的简单确定性素数测试

c++ - 使用 C++ 连接到 mysql

c++ - reinterpret_cast 与 static_cast 用于在标准布局类型中写入字节?

swift - 加速质数生成

math - 不同质数的异或可以为 0 吗?

python - 在 Python 中分解一个数字

c++ - 如何通过Valgrind查找QThreads程序中的内存泄漏位置?