我想在不使用除法的情况下计算正实数的乘法逆。在阅读了 Newton Raphson 方法的各个页面后,我实现了以下代码来计算逆:
#define PRECISION 0.1e-5
double inverse(double num) {
double ans = num;
while (ans * num > 1 + PRECISION || ans * num < 1 - PRECISION) {
ans = ans * (2 - num * ans);
}
return ans;
}
现在,问题是,我实际上没有得到反值。循环无限进行。
所以,我注意到的第一ans
件事是:变得负数的值,我添加了一个声明if (ans < 0) ans *= -1;
,以便ans
始终保持正数。
需要注意的第二点:如果我的初始化,ans = 0.5
那么我得到了几个num
=值的正确答案(1, 2, 3, 5)
。
所以,我的假设是,由于变量初始化不当,实现无法正常工作ans
。
所以,最后我的问题是:
1。这种方法实际上可以用来计算所有正实数的倒数吗?
2 .如果是,那么在使用牛顿拉夫森法时,假设的初始值有什么条件吗?
3 .有没有其他更好的方法来计算倒数而不使用除法?
编辑:
感谢你的回答。因此,如答案中所述,我将初始值更改为ans
toPRECISION
并且它有效!此外,现在由于初始值适用于特定的最大限制num
,ans
因此永远不会变为负数,因此不需要我最初添加的否定检查条件。
所以,这是工作代码(至少适用于我给出的输入。)
double inverse(double num) {
// Added to make it valid for all inputs.
// For a too large number under the precision constraint, the answer is 0.
if (num > 999999)
return 0;
double ans = PRECISION;
while (ans * num > 1 + PRECISION || ans * num < 1 - PRECISION) {
ans = ans * (2 - num * ans);
}
return ans;
}