一些背景
我正在研究 SLATEC 例程的 C++ 翻译R1UPDT,它执行 Givens 旋转:
通常,这个方程的形式略有不同,具体取决于是否. 一个临时变量,, 用于使得小于.
方程写成.
方程写成.
无论哪种方式,都可以避免潜在的溢出风险,因为平方项小于 1。
到现在为止还挺好。
关于问题
但是,Fortran 代码R1UPDT是这样编写的
IE,
r = 0.5 / SQRT(0.25 + 0.25 * C**2)
我不得不问:为什么计算是这样编码的?方程的 RHS 可以简单地手动分解并编码。
IE,
r = 1.0 / SQRT(1.0 + C**2)
我的第一个想法是可以消除一次乘法并加快程序执行速度。然而,也许这是另一种避免溢出的技术。或者也许确保radicand在范围内可以更快地计算或产生更准确的结果。我只是推测;也许这里有人可以澄清一下。
这里的任何人都知道为什么没有从这段代码中取出公因数吗?
