在C ++中使用ceil函数时的计算错误

时间:2014-10-18 12:03:14

标签: c++ primes sieve-of-eratosthenes ceil

我是C ++的新手。我试图实现一个分段筛,找到给定数m和n之间的素数。我的逻辑也可能是错的。以下是我写的代码,

long long m;
long long n;
std::cin >> m;
std::cin >> n;
vector<bool> sieve(n-m+1,true);
for(int i=2;i<sqrt(n);i++) {
    long long j = ceil(float(m)/float(i));
    while(j*i <= n) {
        sieve[j*i - m] = false;
        j++;
    }
}

该代码适用于小的m值(即起始编号)。但是,当我将m的值增加到10 ^ 8时。我得到一个seg错误,因为(j * i-m)的值变为负数。在调试m = 63458900的值期间,对于i = 3,我得到j = 21152966,当它在ceil函数之后应该是21152967。

n-m的值总是小于10 ^ 6.

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:2)

你得到的价值是一个 - 在21152967之后它应该是ceil

您可以简化

ceil(float(m)/float(i))

(m + i - 1) / i

从而避免潜在的不精确。
替换相应的值会在您的计算机上生成(63458900ll + 3 - 1)/321152967