0

我想了解为什么这段代码:

double r,d,rc;
scanf("%lf %lf", &r, &d);
rc = (r * r) - (d/2) * (d/2);
printf("%.2f\n", M_PI * rc);

返回比这个更精确的结果(没有rc变量赋值):

double r,d,rc;
scanf("%lf %lf", &r, &d);
printf("%.2f\n", M_PI * (r * r) - (d/2) * (d/2));

另一个相关的问题:为什么n * n优于pow(n,2)

4

2 回答 2

5

第一个代码示例计算:

M_PI * ((r * r) - (d/2) * (d/2));

第二个计算:

(M_PI * (r * r)) - (d/2) * (d/2);

在大多数编译器上,调用与pow(n, 2), 相同。n * n将发出完全相同的程序集。这是由于称为“强度减少”的优化——大多数pow()实现将检查指数是否为 2,并将这种情况减少为单次乘法。未优化的版本稍微贵一些,因为它需要函数调用和一些分支。

请注意,这M_PI不是 C 标准的一部分,因此您可以使用等效的,它编译为完全相同的代码:

double M_PI = 4.0 * atan(1.0);
于 2013-03-14T22:59:44.617 回答
0

回答第二个问题;pow旨在执行任意幂,但是当幂恒定时,有一种更快的方法来计算答案也就不足为奇了。单次乘法速度很快(只需一条处理器指令),而调用pow需要函数调用开销(暂时忽略优化)和反复乘法直到得到答案的迭代算法。当您可以看到避免此类事情的数学捷径时,您就会使用它。

于 2013-03-14T23:01:55.977 回答