Cos 与 Sqrt(1 - Sin() ** 2) 的性能

Performance of Cos vs. Sqrt(1 - Sin() ** 2)

我在我的程序中计算了很多 cos(x)。在 Fortran 中坚持使用 cos(x) 还是计算 sqrt(1-sin(x)**2) 效率更高?如果 sqrt 方法更有效,我会牺牲任何准确性吗?而且,我想,最重要的问题是 sqrt 是否更有效率。我是否可以期望编译器无论如何都能识别并为我更改它?

您应该注意的第一件事是,您必须小心选择 sqrt(1 - sin(x)**2) 的正确根,否则您 运行 评估 |cos(x)| 的风险不一样。这本身就增加了复杂性。

使用 cos(x),因为您应该避免这种可感知的微优化:您将击败现代 FORTRAN 编译器采用的任何优化方法。

即使在我使用 FORTRAN 时,聪明的 FORTRAN 编译器也会使用芯片组上可用的三角函数。 sqrt 总体上仍然是使用 Newton-Raphson 类型的算法实现的,其评估将需要几个时钟周期。

我的预感是最新的编译器 为您反转身份并替换 cos(x):检查输出程序集。

但如果您有任何疑问,请对其进行分析。