-4

我正在解决欧拉问题。10 要求找到所有低于 200 万的素数之和。我在使用sqrtpow功能上得到了不同的结果。Usingsqrt给出了正确的答案,加上使用 pow 函数需要更多时间。这是我的代码。

for(sum=0,i=3;i<=2000000;i+=2)
{
    for(j=3;j<=sqrt(i);j++)
        if(i%j==0)
            break;
    if(j>sqrt(i))
        sum+=i;
}
sum+=2;
std::cout << "\nSum = " << sum;
4

3 回答 3

1

我无法在我的计算机上重现您的问题,但是您的测试double非常危险。如果i是素数的平方,则您依靠 的高精度sqrtpow获得正确的结果。也许在您的系统上,一个或多个这样的正方形有轻微的舍入差异。你最好测试j*j <= ij*j > i.

于 2013-06-02T10:35:54.180 回答
0

pow很难正确实施——也就是说,这样的事情会为那些正确答案的人pow(x*x, 0.5)返回。很少有实现(CRlibm 是一个明显的例外)正确实现。xxpow

sqrt另一方面,IEEE 规范保证正确舍入,这就是为什么您的代码适用于sqrt而不适用于pow.

于 2013-06-02T10:39:23.273 回答
0

首先,sqrt(x) 应该比 更快更准确pow(x,0.5),为什么你认为它在库中?其次,您可能会得到错误的答案,因为您的循环终止条件正在测试一个浮点数。在这 200 万个循环中的某个地方的一个小舍入可能足以甩掉总数。最后,您在循环的每次迭代中计算浮点 sqrt() 两次,这非常慢。

代替

for (j = 0; j <= sqrt(i); ++j)  . . .

尝试

limit = (int)(sqrt(i) + 0.5);
for (j = 0; j <= limit; ++j) . . .
于 2013-06-02T10:45:52.093 回答