我正在解决欧拉问题。 10要求找出低于200万的所有素数的总和。
我使用sqrt
和pow
函数获得了不同的结果。
使用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;
答案 0 :(得分:1)
我无法在计算机上重现您的问题,但您在double
上的测试非常危险。如果i
是素数的平方,则您依靠sqrt
和pow
的高精度来获得正确的结果。也许在你的系统上,在一个或多个这样的方块上存在轻微的舍入差异。您最好测试j*j <= i
和j*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) . . .