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)
:检查输出程序集。
但如果您有任何疑问,请对其进行分析。
我在我的程序中计算了很多 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)
:检查输出程序集。
但如果您有任何疑问,请对其进行分析。