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

Calculation error while using ceil function in C++

本文关键字:计算 错误 函数 ceil C++      更新时间:2023-10-16

我是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。

非常感谢您的帮助。非常感谢。

您得到的值相差一——它应该是ceil之后的21152967

您可以简化

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

(m + i - 1) / i

从而避免潜在的不精确性
替换相应的值会产生(63458900ll + 3 - 1)/3,在您的机器上应该是21152967