DSP

简易的开方函数

2019-07-13 18:14发布

def my_sqrt(x, error=0.00000000000000001): g = 1 while abs(g ** 2 - x) >= error: g = (g + x / g) / 2 return g print(my_sqrt(1000000000000)) 碰到了浮点数的误差,浮点数的误差有截断误差和四则运算过程中的累加误差。
前者是因为十进制可表示的浮点数转换成二进制的浮点数可能是一个无限循环小数或者无限不循环小数,而计算机表示浮点数的位数有限,引起截断误差。(如果十进制本身就像有浮点数表示一个无限小数,那么就已经引起了误差)。也有可能是十进制浮点数转换成二进制浮点数的时候位数太多,虽然不是无限多位但依然不够表示引起截断误差。
后者是因为浮点数运算的规则,大数和小数之间的运算会导致小数丢弃一部分位数,四则运算中,乘法的误差大于加减法,除法的误差最大。