Python中使用Newton法计算倒数结果为负异常问题咨询
问题原因
你的代码核心问题是初始值x0选择不符合牛顿迭代的收敛要求。
你使用的牛顿法求倒数迭代公式 x_{n+1} = x_n * (2 - a * x_n) 仅当初始值满足 0 < x0 < 2/a 时,才会收敛到目标值 1/a。你直接将输入值a赋值给x0,绝大多数场景下都会超出收敛区间,导致迭代发散,数值越算越大甚至出现正负震荡,最终得到你遇到的数值极大的负数结果。
以你测试的rcp(5.0)为例:
收敛要求x0必须小于2/5=0.4,而你的初始值x0=5,第一次迭代就会得到 5*(2 - 5*5) = -115,后续迭代数值会快速爆炸,完全偏离预期。
修复方案
你只需要调整初始值x0的选择逻辑,保证其落在收敛区间内即可。如果需要保留牛顿法「无除法计算倒数」的特性,可以通过位运算对初始值做粗略估算,修复后的代码如下:
import struct def rcp(a: float) -> float: if a == 0: raise ValueError("0不存在倒数") a = float(a) # 无除法估算初始值,确保0 < x0 < 2/a bits = struct.unpack('!I', struct.pack('!f', a))[0] exp = (bits >> 23) & 0xff x0 = 2.0 ** (127 - exp) # 迭代计算 for _ in range(5): x0 = x0 * (2 - a * x0) return x0 print(rcp(5.0))
运行后将输出接近0.2的正确结果。如果不需要实现无除法计算,也可以直接用x0 = 0.1之类的粗略值(只要符合收敛条件)做初始值,同样可以得到正确结果。
内容的提问来源于stack exchange,提问作者txk2048
相关产品推荐
相关产品推荐

