使用sqrt()和pow()函数的结果不同

时间:2013-06-02 10:07:38

标签: c++ c

我正在解决欧拉问题。 10要求找出低于200万的所有素数的总和。 我使用sqrtpow函数获得了不同的结果。 使用sqrt给出正确答案,加上使用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;

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

pow很难正确实施 - 也就是说,pow(x*x, 0.5)之类的内容会为x返回x,这是正确的答案。很少有实现(CRlibm是一个值得注意的例外)正确实现pow

另一方面,

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

答案 2 :(得分: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) . . .